Commit 3efdfe612e
Changed files (1)
lib
std
Thread
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);
+}