From 3efdfe612ec7aaf252f6391b4d29bbf46118eced Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 6 Mar 2024 22:25:35 -0700 Subject: [PATCH] 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. --- lib/std/Thread/WaitGroup.zig | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/std/Thread/WaitGroup.zig b/lib/std/Thread/WaitGroup.zig index a6a82a9492..d85188fa78 100644 --- 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); +}