Commit 3efdfe612e

Andrew Kelley <andrew@ziglang.org>
2024-03-07 06:25:35
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.
1 parent ffd53a4
Changed files (1)
lib
std
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);
+}