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/ › Kqueue.zig › AsyncClosure
AsyncClosure
Kqueue.AsyncClosure
const AsyncClosure = struct
File
Code
const AsyncClosure = struct {
kqueue : *Kqueue ,
fiber : *Fiber ,
start : *const fn (context : *const anyopaque , result : *anyopaque ) void ,
result_align : Alignment ,
already_awaited : bool ,
fn contextPointer (closure : *AsyncClosure ) [*]align (Fiber .max_context_align .toByteUnits ()) u8 {
return @alignCast (@as ([*]u8 , @ptrCast (closure )) + @sizeOf (AsyncClosure ));
}
fn call (closure : *AsyncClosure , message : *const SwitchMessage ) callconv (.withStackAlign (.c , @alignOf (AsyncClosure ))) noreturn {
message .handle (closure .kqueue );
const fiber = closure .fiber ;
std .log .debug ("{*} performing async" , .{fiber });
closure .start (closure .contextPointer (), fiber .resultBytes (closure .result_align ));
const awaiter = @atomicRmw (?*Fiber , &fiber .awaiter , .Xchg , Fiber .finished , .acq_rel );
const ready_awaiter = r : {
const a = awaiter orelse break :r null ;
if (@atomicRmw (bool , &closure .already_awaited , .Xchg , true , .acq_rel )) break :r null ;
break :r a ;
};
closure .kqueue .yield (ready_awaiter , .nothing );
unreachable ;
}
fn fromFiber (fiber : *Fiber ) *AsyncClosure {
return @ptrFromInt (Fiber .max_context_align .max (.of (AsyncClosure )).backward (
@intFromPtr (fiber .allocatedEnd ()) - Fiber .max_context_size ,
) - @sizeOf (AsyncClosure ));
}
}