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 {
503503 }
504504 }
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 {
507507 var resume_node = ResumeNode.Basic{
508508 .base = ResumeNode{
509509 .id = ResumeNode.Id.Basic,
......@@ -512,21 +512,28 @@ pub const Loop = struct {
512512 },
513513 .kev = undefined,
514514 };
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
516523 suspend {
517 self.bsdAddKev(&resume_node, ident, filter, fflags) catch unreachable;
524 self.bsdAddKev(&resume_node, ident, filter, flags) catch unreachable;
518525 }
519526 }
520527
521528 /// 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 {
523530 self.beginOneEvent();
524531 errdefer self.finishOneEvent();
525532 var kev = [1]os.Kevent{os.Kevent{
526533 .ident = ident,
527534 .filter = filter,
528 .flags = os.EV_ADD | os.EV_ENABLE | os.EV_CLEAR,
529 .fflags = fflags,
535 .flags = os.EV_ADD | os.EV_ENABLE | os.EV_CLEAR | flags,
536 .fflags = 0,
530537 .data = 0,
531538 .udata = @ptrToInt(&resume_node.base),
532539 }};
......@@ -616,14 +623,16 @@ pub const Loop = struct {
616623
617624 self.workerRun();
618625
619 switch (builtin.os.tag) {
620 .linux,
621 .macosx,
622 .freebsd,
623 .netbsd,
624 .dragonfly,
625 => self.fs_thread.wait(),
626 else => {},
626 if (!builtin.single_threaded) {
627 switch (builtin.os.tag) {
628 .linux,
629 .macosx,
630 .freebsd,
631 .netbsd,
632 .dragonfly,
633 => self.fs_thread.wait(),
634 else => {},
635 }
627636 }
628637
629638 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
25492549 EAFNOSUPPORT => return error.AddressFamilyNotSupported,
25502550 EAGAIN, EINPROGRESS => {
25512551 const loop = std.event.Loop.instance orelse return error.WouldBlock;
2552 loop.waitUntilFdWritableOrReadable(sockfd);
2552 loop.waitUntilFdWritable(sockfd);
25532553 return getsockoptError(sockfd);
25542554 },
25552555 EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed.