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/ › Uring.zig › random
random
Uring.random
fn random (userdata : ?*anyopaque , buffer : []u8 ) void
File
Code
fn random (userdata : ?*anyopaque , buffer : []u8 ) void {
const ev : *Evented = @ptrCast (@alignCast (userdata ));
var thread : *Thread = .current ();
if (!thread .csprng .isInitialized ()) {
@branchHint (.unlikely );
var seed : [Csprng .seed_len ]u8 = undefined ;
{
const ev_io = ev .io ();
ev .csprng_mutex .lockUncancelable (ev_io );
defer ev .csprng_mutex .unlock (ev_io );
if (!ev .csprng .isInitialized ()) {
@branchHint (.unlikely );
var cancel_region : CancelRegion = .initBlocked ();
defer cancel_region .deinit ();
ev .urandomReadAll (&cancel_region , &seed ) catch |err | switch (err ) {
error .Canceled => unreachable ,
else => fallbackSeed (ev , &seed ),
};
ev .csprng .rng = .init (seed );
thread = .current ();
}
ev .csprng .rng .fill (&seed );
}
if (!thread .csprng .isInitialized ()) {
@branchHint (.likely );
thread .csprng .rng = .init (seed );
} else thread .csprng .rng .addEntropy (&seed );
}
thread .csprng .rng .fill (buffer );
}