Function spawn [src]

Prototype

pub fn spawn(pool: *Pool, comptime func: anytype, args: anytype) !void

Parameters

pool: *Pool

Example

test spawn { const TestFn = struct { fn checkRun(completed: *bool) void { completed.* = true; } }; var completed: bool = false; { var pool: Pool = undefined; try pool.init(.{ .allocator = std.testing.allocator, }); defer pool.deinit(); try pool.spawn(TestFn.checkRun, .{&completed}); } try std.testing.expectEqual(true, completed); }

Source

pub fn spawn(pool: *Pool, comptime func: anytype, args: anytype) !void { if (builtin.single_threaded) { @call(.auto, func, args); return; } const Args = @TypeOf(args); const Closure = struct { arguments: Args, pool: *Pool, run_node: RunQueue.Node = .{ .data = .{ .runFn = runFn } }, fn runFn(runnable: *Runnable, _: ?usize) void { const run_node: *RunQueue.Node = @fieldParentPtr("data", runnable); const closure: *@This() = @alignCast(@fieldParentPtr("run_node", run_node)); @call(.auto, func, closure.arguments); // The thread pool's allocator is protected by the mutex. const mutex = &closure.pool.mutex; mutex.lock(); defer mutex.unlock(); closure.pool.allocator.destroy(closure); } }; { pool.mutex.lock(); defer pool.mutex.unlock(); const closure = try pool.allocator.create(Closure); closure.* = .{ .arguments = args, .pool = pool, }; pool.run_queue.prepend(&closure.run_node); } // Notify waiting threads outside the lock to try and keep the critical section small. pool.cond.signal(); }