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 standard library.
std › Io › Threaded › condWait Private Function condWait Doc Source Private Function std.Io.Threaded.condWait
fn condWait (cond : *Io .Condition , mutex : *Io .Mutex ) void Params cond : *Io .Condition mutex : *Io .Mutex File Io/Threaded.zig: 19046
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
19058
19059
19060
19061
19062
19063
19064
19065
19066
19067
19068
19069
19070
19071
19072
19073 fn condWait (cond : *Io .Condition , mutex : *Io .Mutex ) void {
var epoch = cond .epoch .load (.acquire ); // `.acquire` to ensure ordered before state load
{
const prev_state = cond .state .fetchAdd (.{ .waiters = 1 , .signals = 0 }, .monotonic );
assert (prev_state .waiters < std .math .maxInt (u16 )); // overflow caused by too many waiters
}
mutexUnlock (mutex );
defer mutexLock (mutex );
while (true ) {
Thread .futexWaitUncancelable (&cond .epoch .raw , epoch , null );
epoch = cond .epoch .load (.acquire ); // `.acquire` to ensure ordered before `state` laod
var prev_state = cond .state .load (.monotonic );
while (prev_state .signals > 0 ) {
prev_state = cond .state .cmpxchgWeak (prev_state , .{
.waiters = prev_state .waiters - 1 ,
.signals = prev_state .signals - 1 ,
}, .acquire , .monotonic ) orelse {
// We successfully consumed a signal.
return ;
};
}
}
}
Same as
Io.Condition.waitUncancelablebut avoids the VTable.