authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-09-24 00:01:22-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-09-24 00:01:22-04:00
log0f3111379b940823090b3a0e540aa04fac64dc5b
tree03ab9dd96f9d8d334bb8902a5e2a6387af321aae
parent274c55b780c8ef954f335536bdfcf79cd8d9f6ca
parentbbff6bd6754bbddef03e163406d09c748a479073
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #6399 from FireFox317/async-fix

Eventloop: Fix deadlock in linux event loop implementation

1 files changed, 8 insertions(+), 8 deletions(-)

lib/std/event/loop.zig+8-8
......@@ -687,9 +687,14 @@ pub const Loop = struct {
687687
688688 switch (builtin.os.tag) {
689689 .linux => {
690 // writing 8 bytes to an eventfd cannot fail
691 const amt = os.write(self.os_data.final_eventfd, &wakeup_bytes) catch unreachable;
692 assert(amt == wakeup_bytes.len);
690 // writing to the eventfd will only wake up one thread, thus multiple writes
691 // are needed to wakeup all the threads
692 var i: usize = 0;
693 while (i < self.extra_threads.len + 1) : (i += 1) {
694 // writing 8 bytes to an eventfd cannot fail
695 const amt = os.write(self.os_data.final_eventfd, &wakeup_bytes) catch unreachable;
696 assert(amt == wakeup_bytes.len);
697 }
693698 return;
694699 },
695700 .macosx, .freebsd, .netbsd, .dragonfly => {
......@@ -1252,11 +1257,6 @@ test "std.event.Loop - basic" {
12521257 // https://github.com/ziglang/zig/issues/1908
12531258 if (builtin.single_threaded) return error.SkipZigTest;
12541259
1255 if (true) {
1256 // https://github.com/ziglang/zig/issues/4922
1257 return error.SkipZigTest;
1258 }
1259
12601260 var loop: Loop = undefined;
12611261 try loop.initMultiThreaded();
12621262 defer loop.deinit();