feature. See also
. The project being documented here (as the example) is the Zig library itself.
SafeAllocator.fuzzMultiThreadedWorker
fn fuzzMultiThreadedWorker(
io: std.Io,
ops: *FuzzMultiThreadedContext.ThreadOps,
) error
File
Code
fn fuzzMultiThreadedWorker(
io: std.Io,
ops: *FuzzMultiThreadedContext.ThreadOps,
) error{Canceled}!void {
const no_ra: usize = 0;
var next_run: FuzzMultiThreadedContext.ThreadOps.Run = .{ .n = true };
while (true) {
try ops.run.wait(next_run, io);
next_run = .next(next_run);
while (true) {
const i = @atomicRmw(usize, &ops.i, .Add, 1, .monotonic);
if (i >= ops.items.len) {
// which the read value was written from, not all previous writer threads.
const prev_rem = @atomicRmw(u32, &ops.running, .Sub, 1, .acq_rel);
if (prev_rem - 1 == 0) {
io.futexWake(u32, &ops.running, 1);
}
break;
}
switch (ops.items[i]) {
.alloc => |call| {
const alloc_ptr = alloc(&ops.instance, call.len, call.alignment, no_ra);
if (alloc_ptr) |memory_ptr| {
const memory = memory_ptr[0..call.len];
if (call.splat) |b| @memset(memory, b);
call.result.memory = memory;
} else {
call.result.memory = null;
}
call.result.ready.set(io);
},
.free => |call| {
const memory = call.memory.get(io) orelse continue;
fuzz_probs.checkSplat(call.splat, memory);
free(&ops.instance, memory, call.alignment, no_ra);
},
.resize, .remap => |call, kind| {
const memory = call.memory.get(io) orelse {
call.result.memory = null;
call.result.ready.set(io);
continue;
};
const new_memory: []u8 = switch (kind) {
.remap => if (remap(
&ops.instance,
memory,
call.alignment,
call.new_len,
no_ra,
)) |new_ptr| new_ptr[0..call.new_len] else memory,
.resize => if (resize(
&ops.instance,
memory,
call.alignment,
call.new_len,
no_ra,
)) memory.ptr[0..call.new_len] else memory,
else => unreachable,
};
const old_len = memory.len;
const new_len = new_memory.len;
fuzz_probs.checkSplat(call.splat, new_memory[0..@min(old_len, new_len)]);
if (call.splat) |b| @memset(new_memory[@min(old_len, new_len)..], b);
call.result.memory = new_memory;
call.result.ready.set(io);
},
}
}
}
}