authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-06-21 11:03:44-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-06-30 13:54:02-07:00
log86e68dbf53b40480e6b57b0f184308fd83801b1f
treeb34b1a9da3e28accff2d913de4932be7cf61378b
parentdc207da184087eec7693fbf17c412c4b67c2080c

make the main thread call waitAndWork instead of just wait

The main thread has an implicit thread token which makes loitering illegal.

3 files changed, 15 insertions(+), 20 deletions(-)

src/Compilation.zig+12-15
......@@ -222,9 +222,6 @@ emit_asm: ?EmitLoc,
222222emit_llvm_ir: ?EmitLoc,
223223emit_llvm_bc: ?EmitLoc,
224224
225work_queue_wait_group: WaitGroup = .{},
226astgen_wait_group: WaitGroup = .{},
227
228225llvm_opt_bisect_limit: c_int,
229226
230227pub const Emit = struct {
......@@ -3251,13 +3248,13 @@ pub fn performAllTheWork(
32513248 // (at least for now) single-threaded main work queue. However, C object compilation
32523249 // only needs to be finished by the end of this function.
32533250
3254 comp.work_queue_wait_group.reset();
3255 defer comp.work_queue_wait_group.wait();
3251 var work_queue_wait_group: WaitGroup = .{};
3252 defer comp.thread_pool.waitAndWork(&work_queue_wait_group);
32563253
32573254 if (!build_options.only_c and !build_options.only_core_functionality) {
32583255 if (comp.docs_emit != null) {
3259 comp.thread_pool.spawnWg(&comp.work_queue_wait_group, workerDocsCopy, .{comp});
3260 comp.work_queue_wait_group.spawnManager(workerDocsWasm, .{ comp, main_progress_node });
3256 comp.thread_pool.spawnWg(&work_queue_wait_group, workerDocsCopy, .{comp});
3257 work_queue_wait_group.spawnManager(workerDocsWasm, .{ comp, main_progress_node });
32613258 }
32623259 }
32633260
......@@ -3268,8 +3265,8 @@ pub fn performAllTheWork(
32683265 const zir_prog_node = main_progress_node.start("AST Lowering", 0);
32693266 defer zir_prog_node.end();
32703267
3271 comp.astgen_wait_group.reset();
3272 defer comp.astgen_wait_group.wait();
3268 var astgen_wait_group: WaitGroup = .{};
3269 defer comp.thread_pool.waitAndWork(&astgen_wait_group);
32733270
32743271 // builtin.zig is handled specially for two reasons:
32753272 // 1. to avoid race condition of zig processes truncating each other's builtin.zig files
......@@ -3291,33 +3288,33 @@ pub fn performAllTheWork(
32913288
32923289 const file = mod.builtin_file orelse continue;
32933290
3294 comp.thread_pool.spawnWg(&comp.astgen_wait_group, workerUpdateBuiltinZigFile, .{
3291 comp.thread_pool.spawnWg(&astgen_wait_group, workerUpdateBuiltinZigFile, .{
32953292 comp, mod, file,
32963293 });
32973294 }
32983295 }
32993296
33003297 while (comp.astgen_work_queue.readItem()) |file| {
3301 comp.thread_pool.spawnWg(&comp.astgen_wait_group, workerAstGenFile, .{
3302 comp, file, zir_prog_node, &comp.astgen_wait_group, .root,
3298 comp.thread_pool.spawnWg(&astgen_wait_group, workerAstGenFile, .{
3299 comp, file, zir_prog_node, &astgen_wait_group, .root,
33033300 });
33043301 }
33053302
33063303 while (comp.embed_file_work_queue.readItem()) |embed_file| {
3307 comp.thread_pool.spawnWg(&comp.astgen_wait_group, workerCheckEmbedFile, .{
3304 comp.thread_pool.spawnWg(&astgen_wait_group, workerCheckEmbedFile, .{
33083305 comp, embed_file,
33093306 });
33103307 }
33113308
33123309 while (comp.c_object_work_queue.readItem()) |c_object| {
3313 comp.thread_pool.spawnWg(&comp.work_queue_wait_group, workerUpdateCObject, .{
3310 comp.thread_pool.spawnWg(&work_queue_wait_group, workerUpdateCObject, .{
33143311 comp, c_object, main_progress_node,
33153312 });
33163313 }
33173314
33183315 if (!build_options.only_core_functionality) {
33193316 while (comp.win32_resource_work_queue.readItem()) |win32_resource| {
3320 comp.thread_pool.spawnWg(&comp.work_queue_wait_group, workerUpdateWin32Resource, .{
3317 comp.thread_pool.spawnWg(&work_queue_wait_group, workerUpdateWin32Resource, .{
33213318 comp, win32_resource, main_progress_node,
33223319 });
33233320 }
src/link/MachO/hasher.zig+2-4
......@@ -12,8 +12,6 @@ pub fn ParallelHasher(comptime Hasher: type) type {
1212 const tracy = trace(@src());
1313 defer tracy.end();
1414
15 var wg: WaitGroup = .{};
16
1715 const file_size = blk: {
1816 const file_size = opts.max_file_size orelse try file.getEndPos();
1917 break :blk std.math.cast(usize, file_size) orelse return error.Overflow;
......@@ -27,8 +25,8 @@ pub fn ParallelHasher(comptime Hasher: type) type {
2725 defer self.allocator.free(results);
2826
2927 {
30 wg.reset();
31 defer wg.wait();
28 var wg: WaitGroup = .{};
29 defer self.thread_pool.waitAndWork(&wg);
3230
3331 for (out, results, 0..) |*out_buf, *result, i| {
3432 const fstart = i * chunk_size;
src/main.zig+1-1
......@@ -5062,7 +5062,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
50625062 job_queue.thread_pool.spawnWg(&job_queue.wait_group, Package.Fetch.workerRun, .{
50635063 &fetch, "root",
50645064 });
5065 job_queue.wait_group.wait();
5065 job_queue.thread_pool.waitAndWork(&job_queue.wait_group);
50665066
50675067 try job_queue.consolidateErrors();
50685068