fn seed(context: ?*anyopaque) callconv(.c) void context: ?*anyopaque4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774 fn seed(context: ?*anyopaque) callconv(.c) void {
const rand: *Random = @ptrCast(@alignCast(context));
const ev = rand.evented;
ev.csprng_mutex.lockUncancelable(ev);
defer ev.csprng_mutex.unlock();
var buffer: [Csprng.seed_len]u8 = undefined;
if (!ev.csprng.isInitialized()) {
@branchHint(.unlikely);
const cancel_protection = swapCancelProtection(ev, .blocked);
defer assert(swapCancelProtection(ev, cancel_protection) == .blocked);
randomSecure(ev, &buffer) catch |err| switch (err) {
error.Canceled => unreachable, // blocked
error.EntropyUnavailable => fallbackSeed(ev, &buffer),
};
ev.csprng.rng = .init(buffer);
}
ev.csprng.rng.fill(&buffer);
rand.thread.csprng.rng = .init(buffer);
rand.thread.csprng.rng.fill(rand.buffer);
rand.buffer.len = 0;
}