| ... | @@ -503,7 +503,7 @@ pub const Loop = struct { | ... | @@ -503,7 +503,7 @@ pub const Loop = struct { |
| 503 | } | 503 | } |
| 504 | } | 504 | } |
| 505 | | 505 | |
| 506 | pub fn bsdWaitKev(self: *Loop, ident: usize, filter: i16, fflags: u32) callconv(.Async) void { | 506 | pub fn bsdWaitKev(self: *Loop, ident: usize, filter: i16, flags: u16) void { |
| 507 | var resume_node = ResumeNode.Basic{ | 507 | var resume_node = ResumeNode.Basic{ |
| 508 | .base = ResumeNode{ | 508 | .base = ResumeNode{ |
| 509 | .id = ResumeNode.Id.Basic, | 509 | .id = ResumeNode.Id.Basic, |
| ... | @@ -512,21 +512,28 @@ pub const Loop = struct { | ... | @@ -512,21 +512,28 @@ pub const Loop = struct { |
| 512 | }, | 512 | }, |
| 513 | .kev = undefined, | 513 | .kev = undefined, |
| 514 | }; | 514 | }; |
| 515 | defer self.bsdRemoveKev(ident, filter); | 515 | |
| | 516 | defer { |
| | 517 | // If the kevent was set to be ONESHOT, it doesn't need to be deleted manually. |
| | 518 | if (flags & os.EV_ONESHOT != 0) { |
| | 519 | self.bsdRemoveKev(ident, filter); |
| | 520 | } |
| | 521 | } |
| | 522 | |
| 516 | suspend { | 523 | suspend { |
| 517 | self.bsdAddKev(&resume_node, ident, filter, fflags) catch unreachable; | 524 | self.bsdAddKev(&resume_node, ident, filter, flags) catch unreachable; |
| 518 | } | 525 | } |
| 519 | } | 526 | } |
| 520 | | 527 | |
| 521 | /// resume_node must live longer than the anyframe that it holds a reference to. | 528 | /// resume_node must live longer than the anyframe that it holds a reference to. |
| 522 | pub fn bsdAddKev(self: *Loop, resume_node: *ResumeNode.Basic, ident: usize, filter: i16, fflags: u32) !void { | 529 | pub fn bsdAddKev(self: *Loop, resume_node: *ResumeNode.Basic, ident: usize, filter: i16, flags: u16) !void { |
| 523 | self.beginOneEvent(); | 530 | self.beginOneEvent(); |
| 524 | errdefer self.finishOneEvent(); | 531 | errdefer self.finishOneEvent(); |
| 525 | var kev = [1]os.Kevent{os.Kevent{ | 532 | var kev = [1]os.Kevent{os.Kevent{ |
| 526 | .ident = ident, | 533 | .ident = ident, |
| 527 | .filter = filter, | 534 | .filter = filter, |
| 528 | .flags = os.EV_ADD | os.EV_ENABLE | os.EV_CLEAR, | 535 | .flags = os.EV_ADD | os.EV_ENABLE | os.EV_CLEAR | flags, |
| 529 | .fflags = fflags, | 536 | .fflags = 0, |
| 530 | .data = 0, | 537 | .data = 0, |
| 531 | .udata = @ptrToInt(&resume_node.base), | 538 | .udata = @ptrToInt(&resume_node.base), |
| 532 | }}; | 539 | }}; |
| ... | @@ -616,14 +623,16 @@ pub const Loop = struct { | ... | @@ -616,14 +623,16 @@ pub const Loop = struct { |
| 616 | | 623 | |
| 617 | self.workerRun(); | 624 | self.workerRun(); |
| 618 | | 625 | |
| 619 | switch (builtin.os.tag) { | 626 | if (!builtin.single_threaded) { |
| 620 | .linux, | 627 | switch (builtin.os.tag) { |
| 621 | .macosx, | 628 | .linux, |
| 622 | .freebsd, | 629 | .macosx, |
| 623 | .netbsd, | 630 | .freebsd, |
| 624 | .dragonfly, | 631 | .netbsd, |
| 625 | => self.fs_thread.wait(), | 632 | .dragonfly, |
| 626 | else => {}, | 633 | => self.fs_thread.wait(), |
| | 634 | else => {}, |
| | 635 | } |
| 627 | } | 636 | } |
| 628 | | 637 | |
| 629 | for (self.extra_threads) |extra_thread| { | 638 | for (self.extra_threads) |extra_thread| { |