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 › Dispatch › Mutex › Waiter › add Private Function add Doc Source Private Function std.Io.Dispatch.Mutex.Waiter.add
fn add (context : ?*anyopaque ) callconv (.c ) void Params File Io/Dispatch.zig: 829
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853 fn add (context : ?*anyopaque ) callconv (.c ) void {
const waiter : *Waiter = @ptrCast (@alignCast (context ));
waiter .cancelable .enter (waiter .sleeper .fiber ) catch |err | switch (err ) {
error .CancelRequested => return waiter .wake (),
};
var state = @atomicRmw (State , &waiter .mutex .state , .Add , .{
.locked = false ,
.num_waiters = 1 ,
}, .monotonic );
state .num_waiters += 1 ;
while (!state .locked ) {
@branchHint (.unlikely );
state = @cmpxchgWeak (State , &waiter .mutex .state , state , .{
.locked = true ,
.num_waiters = state .num_waiters - 1 ,
}, .acquire , .monotonic ) orelse break ;
} else return waiter .mutex .waiters .append (&waiter .node );
waiter .cancelable .leave (waiter .sleeper .fiber ) catch |err | switch (err ) {
error .CancelRequested => {
waiter .node .next = &waiter .node ;
return ;
},
};
waiter .wake ();
}