zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 3efdfe612ec7aaf252f6391b4d29bbf46118eced (tree)
parent ffd53a459e1b665e5070987f68dd583171a12459
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Wed,  6 Mar 2024 22:25:35 -0700

std.Thread.WaitGroup: add spawnManaged

Provides a convenient way to spawn a new thread that bypasses a thread
pool. Appropriate when the spawned thread delegates all of its work.

Diffstat:
Mlib/std/Thread/WaitGroup.zig | 22++++++++++++++++++++++
1 file changed, 22 insertions(+), 0 deletions(-)

diff --git a/lib/std/Thread/WaitGroup.zig b/lib/std/Thread/WaitGroup.zig @@ -1,3 +1,4 @@ +const builtin = @import("builtin"); const std = @import("std"); const assert = std.debug.assert; const WaitGroup = @This(); @@ -43,3 +44,24 @@ pub fn isDone(wg: *WaitGroup) bool { return (state / one_pending) == 0; } + +// Spawns a new thread for the task. This is appropriate when the callee +// delegates all work. +pub fn spawnManager( + wg: *WaitGroup, + comptime func: anytype, + args: anytype, +) void { + if (builtin.single_threaded) { + @call(.auto, func, args); + return; + } + const Manager = struct { + fn run(wg_inner: *WaitGroup, args_inner: @TypeOf(args)) void { + defer wg_inner.finish(); + @call(.auto, func, args_inner); + } + }; + wg.start(); + _ = std.Thread.spawn(.{}, Manager.run, .{ wg, args }) catch Manager.run(wg, args); +}