authorgravatar for bill@axzez.comBill Nagel <bill@axzez.com> 2021-01-11 22:21:18-05:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-21 12:16:48+02:00
logcc5e5cca83cca9a1de81f98a333e8a3fcd26df0c
tree38ec9e2ea259acd91ebf821c3b209e7ece944d45
parent1bd434fd18e0cb769ca46849dac056a562ce7ce3

fix race condition in linuxWaitFd


1 files changed, 4 insertions(+), 5 deletions(-)

lib/std/event/loop.zig+4-5
......@@ -440,13 +440,11 @@ pub const Loop = struct {
440440 .overlapped = ResumeNode.overlapped_init,
441441 },
442442 };
443 var need_to_delete = false;
443 var need_to_delete = true;
444444 defer if (need_to_delete) self.linuxRemoveFd(fd);
445445
446446 suspend {
447 if (self.linuxAddFd(fd, &resume_node.base, flags)) |_| {
448 need_to_delete = true;
449 } else |err| switch (err) {
447 self.linuxAddFd(fd, &resume_node.base, flags) catch |err| switch (err) {
450448 error.FileDescriptorNotRegistered => unreachable,
451449 error.OperationCausesCircularLoop => unreachable,
452450 error.FileDescriptorIncompatibleWithEpoll => unreachable,
......@@ -456,6 +454,7 @@ pub const Loop = struct {
456454 error.UserResourceLimitReached,
457455 error.Unexpected,
458456 => {
457 need_to_delete = false;
459458 // Fall back to a blocking poll(). Ideally this codepath is never hit, since
460459 // epoll should be just fine. But this is better than incorrect behavior.
461460 var poll_flags: i16 = 0;
......@@ -479,7 +478,7 @@ pub const Loop = struct {
479478 };
480479 resume @frame();
481480 },
482 }
481 };
483482 }
484483 }
485484