authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-07 13:41:26-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-07 13:41:26-04:00
log3aa259d119ff57a5026d6bc87663fc569c0beee5
tree9bc0ab91656c6fb73c5d77edc51afe3a899a2e1f
parent79bf4003da5fad5046b34d6256eeb8a575890ea5
parent35a59b5b0f3d827a7b3ed785be3155b72d15e682

Merge branch 'kristoff-it-macos-kqueue'

closes #5286

2 files changed, 24 insertions(+), 15 deletions(-)

lib/std/event/loop.zig+23-14
...@@ -503,7 +503,7 @@ pub const Loop = struct {...@@ -503,7 +503,7 @@ pub const Loop = struct {
503 }503 }
504 }504 }
505505
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 }
520527
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 {
616623
617 self.workerRun();624 self.workerRun();
618625
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 }
628637
629 for (self.extra_threads) |extra_thread| {638 for (self.extra_threads) |extra_thread| {
lib/std/os.zig+1-1
...@@ -2549,7 +2549,7 @@ pub fn connect(sockfd: fd_t, sock_addr: *const sockaddr, len: socklen_t) Connect...@@ -2549,7 +2549,7 @@ pub fn connect(sockfd: fd_t, sock_addr: *const sockaddr, len: socklen_t) Connect
2549 EAFNOSUPPORT => return error.AddressFamilyNotSupported,2549 EAFNOSUPPORT => return error.AddressFamilyNotSupported,
2550 EAGAIN, EINPROGRESS => {2550 EAGAIN, EINPROGRESS => {
2551 const loop = std.event.Loop.instance orelse return error.WouldBlock;2551 const loop = std.event.Loop.instance orelse return error.WouldBlock;
2552 loop.waitUntilFdWritableOrReadable(sockfd);2552 loop.waitUntilFdWritable(sockfd);
2553 return getsockoptError(sockfd);2553 return getsockoptError(sockfd);
2554 },2554 },
2555 EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed.2555 EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed.