diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index e492ce60fe..d76a9ecdf5 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -766,6 +766,9 @@ pub const EVFILT_TIMER = 6; /// Filesystem events pub const EVFILT_FS = 7; +/// User events +pub const EVFILT_USER = 1; + /// On input, NOTE_TRIGGER causes the event to be triggered for output. pub const NOTE_TRIGGER = 0x08000000; diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig index 21211c9af0..6a69d6fcc4 100644 --- a/lib/std/event/loop.zig +++ b/lib/std/event/loop.zig @@ -222,27 +222,27 @@ pub const Loop = struct { .handle = undefined, .overlapped = ResumeNode.overlapped_init, }, - .eventfd = try os.eventfd(1, os.EFD_CLOEXEC | os.EFD_NONBLOCK), - .epoll_op = os.EPOLL_CTL_ADD, + .eventfd = try os.eventfd(1, os.linux.EFD.CLOEXEC | os.linux.EFD.NONBLOCK), + .epoll_op = os.linux.EPOLL.CTL_ADD, }, .next = undefined, }; self.available_eventfd_resume_nodes.push(eventfd_node); } - self.os_data.epollfd = try os.epoll_create1(os.EPOLL_CLOEXEC); + self.os_data.epollfd = try os.epoll_create1(os.linux.EPOLL.CLOEXEC); errdefer os.close(self.os_data.epollfd); - self.os_data.final_eventfd = try os.eventfd(0, os.EFD_CLOEXEC | os.EFD_NONBLOCK); + self.os_data.final_eventfd = try os.eventfd(0, os.linux.EFD.CLOEXEC | os.linux.EFD.NONBLOCK); errdefer os.close(self.os_data.final_eventfd); - self.os_data.final_eventfd_event = os.epoll_event{ - .events = os.EPOLLIN, - .data = os.epoll_data{ .ptr = @ptrToInt(&self.final_resume_node) }, + self.os_data.final_eventfd_event = os.linux.epoll_event{ + .events = os.linux.EPOLL.IN, + .data = os.linux.epoll_data{ .ptr = @ptrToInt(&self.final_resume_node) }, }; try os.epoll_ctl( self.os_data.epollfd, - os.EPOLL_CTL_ADD, + os.linux.EPOLL.CTL_ADD, self.os_data.final_eventfd, &self.os_data.final_eventfd_event, ); @@ -283,8 +283,8 @@ pub const Loop = struct { // this one is for sending events .kevent = os.Kevent{ .ident = i, - .filter = os.EVFILT_USER, - .flags = os.EV_CLEAR | os.EV_ADD | os.EV_DISABLE, + .filter = os.system.EVFILT_USER, + .flags = os.system.EV_CLEAR | os.system.EV_ADD | os.system.EV_DISABLE, .fflags = 0, .data = 0, .udata = @ptrToInt(&eventfd_node.data.base), @@ -295,24 +295,24 @@ pub const Loop = struct { self.available_eventfd_resume_nodes.push(eventfd_node); const kevent_array = @as(*const [1]os.Kevent, &eventfd_node.data.kevent); _ = try os.kevent(self.os_data.kqfd, kevent_array, empty_kevs, null); - eventfd_node.data.kevent.flags = os.EV_CLEAR | os.EV_ENABLE; - eventfd_node.data.kevent.fflags = os.NOTE_TRIGGER; + eventfd_node.data.kevent.flags = os.system.EV_CLEAR | os.system.EV_ENABLE; + eventfd_node.data.kevent.fflags = os.system.NOTE_TRIGGER; } // Pre-add so that we cannot get error.SystemResources // later when we try to activate it. self.os_data.final_kevent = os.Kevent{ .ident = extra_thread_count, - .filter = os.EVFILT_USER, - .flags = os.EV_ADD | os.EV_DISABLE, + .filter = os.system.EVFILT_USER, + .flags = os.system.EV_ADD | os.system.EV_DISABLE, .fflags = 0, .data = 0, .udata = @ptrToInt(&self.final_resume_node), }; const final_kev_arr = @as(*const [1]os.Kevent, &self.os_data.final_kevent); _ = try os.kevent(self.os_data.kqfd, final_kev_arr, empty_kevs, null); - self.os_data.final_kevent.flags = os.EV_ENABLE; - self.os_data.final_kevent.fflags = os.NOTE_TRIGGER; + self.os_data.final_kevent.flags = os.system.EV_ENABLE; + self.os_data.final_kevent.fflags = os.system.NOTE_TRIGGER; if (builtin.single_threaded) { assert(extra_thread_count == 0); @@ -404,19 +404,19 @@ pub const Loop = struct { /// resume_node must live longer than the anyframe that it holds a reference to. /// flags must contain EPOLLET pub fn linuxAddFd(self: *Loop, fd: i32, resume_node: *ResumeNode, flags: u32) !void { - assert(flags & os.EPOLLET == os.EPOLLET); + assert(flags & os.linux.EPOLL.ET == os.linux.EPOLL.ET); self.beginOneEvent(); errdefer self.finishOneEvent(); try self.linuxModFd( fd, - os.EPOLL_CTL_ADD, + os.linux.EPOLL.CTL_ADD, flags, resume_node, ); } pub fn linuxModFd(self: *Loop, fd: i32, op: u32, flags: u32, resume_node: *ResumeNode) !void { - assert(flags & os.EPOLLET == os.EPOLLET); + assert(flags & os.linux.EPOLL.ET == os.linux.EPOLL.ET); var ev = os.linux.epoll_event{ .events = flags, .data = os.linux.epoll_data{ .ptr = @ptrToInt(resume_node) }, @@ -425,13 +425,13 @@ pub const Loop = struct { } pub fn linuxRemoveFd(self: *Loop, fd: i32) void { - os.epoll_ctl(self.os_data.epollfd, os.linux.EPOLL_CTL_DEL, fd, null) catch {}; + os.epoll_ctl(self.os_data.epollfd, os.linux.EPOLL.CTL_DEL, fd, null) catch {}; self.finishOneEvent(); } pub fn linuxWaitFd(self: *Loop, fd: i32, flags: u32) void { - assert(flags & os.EPOLLET == os.EPOLLET); - assert(flags & os.EPOLLONESHOT == os.EPOLLONESHOT); + assert(flags & os.linux.EPOLL.ET == os.linux.EPOLL.ET); + assert(flags & os.linux.EPOLL.ONESHOT == os.linux.EPOLL.ONESHOT); var resume_node = ResumeNode.Basic{ .base = ResumeNode{ .id = .Basic, @@ -457,8 +457,8 @@ pub const Loop = struct { // Fall back to a blocking poll(). Ideally this codepath is never hit, since // epoll should be just fine. But this is better than incorrect behavior. var poll_flags: i16 = 0; - if ((flags & os.EPOLLIN) != 0) poll_flags |= os.POLL.IN; - if ((flags & os.EPOLLOUT) != 0) poll_flags |= os.POLL.OUT; + if ((flags & os.linux.EPOLL.IN) != 0) poll_flags |= os.POLL.IN; + if ((flags & os.linux.EPOLL.OUT) != 0) poll_flags |= os.POLL.OUT; var pfd = [1]os.pollfd{os.pollfd{ .fd = fd, .events = poll_flags, @@ -484,10 +484,10 @@ pub const Loop = struct { pub fn waitUntilFdReadable(self: *Loop, fd: os.fd_t) void { switch (builtin.os.tag) { .linux => { - self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLIN); + self.linuxWaitFd(fd, os.linux.EPOLL.ET | os.linux.EPOLL.ONESHOT | os.linux.EPOLL.IN); }, .macos, .freebsd, .netbsd, .dragonfly, .openbsd => { - self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_READ, os.EV_ONESHOT); + self.bsdWaitKev(@intCast(usize, fd), os.system.EVFILT_READ, os.system.EV_ONESHOT); }, else => @compileError("Unsupported OS"), } @@ -496,10 +496,10 @@ pub const Loop = struct { pub fn waitUntilFdWritable(self: *Loop, fd: os.fd_t) void { switch (builtin.os.tag) { .linux => { - self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLOUT); + self.linuxWaitFd(fd, os.linux.EPOLL.ET | os.linux.EPOLL.ONESHOT | os.linux.EPOLL.OUT); }, .macos, .freebsd, .netbsd, .dragonfly, .openbsd => { - self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_WRITE, os.EV_ONESHOT); + self.bsdWaitKev(@intCast(usize, fd), os.system.EVFILT_WRITE, os.system.EV_ONESHOT); }, else => @compileError("Unsupported OS"), } @@ -508,11 +508,11 @@ pub const Loop = struct { pub fn waitUntilFdWritableOrReadable(self: *Loop, fd: os.fd_t) void { switch (builtin.os.tag) { .linux => { - self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLOUT | os.EPOLLIN); + self.linuxWaitFd(fd, os.linux.EPOLL.ET | os.linux.EPOLL.ONESHOT | os.linux.EPOLL.OUT | os.linux.EPOLL.IN); }, .macos, .freebsd, .netbsd, .dragonfly, .openbsd => { - self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_READ, os.EV_ONESHOT); - self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_WRITE, os.EV_ONESHOT); + self.bsdWaitKev(@intCast(usize, fd), os.system.EVFILT_READ, os.system.EV_ONESHOT); + self.bsdWaitKev(@intCast(usize, fd), os.system.EVFILT_WRITE, os.system.EV_ONESHOT); }, else => @compileError("Unsupported OS"), } @@ -530,7 +530,7 @@ pub const Loop = struct { defer { // If the kevent was set to be ONESHOT, it doesn't need to be deleted manually. - if (flags & os.EV_ONESHOT != 0) { + if (flags & os.system.EV_ONESHOT != 0) { self.bsdRemoveKev(ident, filter); } } @@ -547,7 +547,7 @@ pub const Loop = struct { var kev = [1]os.Kevent{os.Kevent{ .ident = ident, .filter = filter, - .flags = os.EV_ADD | os.EV_ENABLE | os.EV_CLEAR | flags, + .flags = os.system.EV_ADD | os.system.EV_ENABLE | os.system.EV_CLEAR | flags, .fflags = 0, .data = 0, .udata = @ptrToInt(&resume_node.base), @@ -560,7 +560,7 @@ pub const Loop = struct { var kev = [1]os.Kevent{os.Kevent{ .ident = ident, .filter = filter, - .flags = os.EV_DELETE, + .flags = os.system.EV_DELETE, .fflags = 0, .data = 0, .udata = 0, @@ -590,8 +590,8 @@ pub const Loop = struct { }, .linux => { // the pending count is already accounted for - const epoll_events = os.EPOLLONESHOT | os.linux.EPOLLIN | os.linux.EPOLLOUT | - os.linux.EPOLLET; + const epoll_events = os.linux.EPOLL.ONESHOT | os.linux.EPOLL.IN | os.linux.EPOLL.OUT | + os.linux.EPOLL.ET; self.linuxModFd( eventfd_node.eventfd, eventfd_node.epoll_op, @@ -1344,7 +1344,7 @@ pub const Loop = struct { .Stop => return, .EventFd => { const event_fd_node = @fieldParentPtr(ResumeNode.EventFd, "base", resume_node); - event_fd_node.epoll_op = os.EPOLL_CTL_MOD; + event_fd_node.epoll_op = os.linux.EPOLL.CTL_MOD; const stack_node = @fieldParentPtr(std.atomic.Stack(ResumeNode.EventFd).Node, "data", event_fd_node); self.available_eventfd_resume_nodes.push(stack_node); }, diff --git a/test/standalone.zig b/test/standalone.zig index 85957923b7..edecbd2b4c 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -5,6 +5,7 @@ pub fn addCases(cases: *tests.StandaloneContext) void { cases.add("test/standalone/hello_world/hello.zig"); cases.addC("test/standalone/hello_world/hello_libc.zig"); cases.add("test/standalone/cat/main.zig"); + cases.add("test/standalone/issue_9693/main.zig"); cases.add("test/standalone/guess_number/main.zig"); cases.add("test/standalone/main_return_error/error_u8.zig"); cases.add("test/standalone/main_return_error/error_u8_non_zero.zig"); diff --git a/test/standalone/issue_9693/main.zig b/test/standalone/issue_9693/main.zig new file mode 100644 index 0000000000..ecf410a1ca --- /dev/null +++ b/test/standalone/issue_9693/main.zig @@ -0,0 +1,2 @@ +pub const io_mode = .evented; +pub fn main() void {}