Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › Io/ › Threaded.zig › WaitGroup
WaitGroup
Threaded.WaitGroup
const WaitGroup = struct
File
Code
const WaitGroup = struct {
state : std .atomic .Value (usize ),
event : Io .Event ,
const init : WaitGroup = .{ .state = .{ .raw = 0 }, .event = .unset };
const is_waiting : usize = 1 << 0 ;
const one_pending : usize = 1 << 1 ;
fn start (wg : *WaitGroup ) void {
const prev_state = wg .state .fetchAdd (one_pending , .monotonic );
assert ((prev_state / one_pending ) < (std .math .maxInt (usize ) / one_pending ));
}
fn value (wg : *WaitGroup ) usize {
return wg .state .load (.monotonic ) / one_pending ;
}
fn wait (wg : *WaitGroup ) void {
const prev_state = wg .state .fetchAdd (is_waiting , .acquire );
assert (prev_state & is_waiting == 0 );
if ((prev_state / one_pending ) > 0 ) eventWait (&wg .event );
}
fn finish (wg : *WaitGroup ) void {
const state = wg .state .fetchSub (one_pending , .acq_rel );
assert ((state / one_pending ) > 0 );
if (state == (one_pending | is_waiting )) {
eventSet (&wg .event );
}
}
}