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 › groupCancel Private Function groupCancel Doc Source Private Function std.Io.Threaded.groupCancel
fn groupCancel (userdata : ?*anyopaque , type_erased : *Io .Group , initial_token : *anyopaque ) void Params userdata : ?*anyopaque type_erased : *Io .Group initial_token : *anyopaque File Io/Threaded.zig: 2341
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369 fn groupCancel (userdata : ?*anyopaque , type_erased : *Io .Group , initial_token : *anyopaque ) void {
_ = initial_token ;
if (builtin .single_threaded ) unreachable ; // nothing to cancel
const t : *Threaded = @ptrCast (@alignCast (userdata ));
const g : Group = .{ .ptr = type_erased };
var num_completed : std .atomic .Value (u32 ) = .init (0 );
g .awaiter ().* = &num_completed ;
const pre_cancel_status = g .status ().fetchOr (.{
.num_running = 0 ,
.have_awaiter = true ,
.canceled = true ,
}, .acq_rel ); // acquire results if complete; release `g.awaiter()`
assert (!pre_cancel_status .have_awaiter );
assert (!pre_cancel_status .canceled );
if (pre_cancel_status .num_running == 0 ) {
// Already done. Since the group is finished, it's illegal to spawn more tasks in it
// until we return, so we can access `g.status()` non-atomically.
g .status ().raw .have_awaiter = false ;
g .status ().raw .canceled = false ;
return ;
}
g .waitForCancelWithSignaling (t , &num_completed , false );
g .status ().raw = .{ .num_running = 0 , .have_awaiter = false , .canceled = false };
}