From 9d77e9e335f965ada1b4c95f7782d9add071412f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 24 Apr 2022 10:21:29 -0700 Subject: [PATCH] kevent properly blocks kevent returns immediately if (1) event list is empty or (2) changelist is NOT empty. This forces CPU on mac to be very high because this becomes a hot loop. --- src/libuv/Embed.zig | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libuv/Embed.zig b/src/libuv/Embed.zig index 89a393b4c..75d2f172e 100644 --- a/src/libuv/Embed.zig +++ b/src/libuv/Embed.zig @@ -108,8 +108,16 @@ fn threadMain(self: *Embed) void { .tv_nsec = @mod(timeout, 1000) * 1000000, }; - var ev: [0]std.os.Kevent = undefined; - _ = std.os.kevent(fd, &ev, &ev, &ts) catch |err| blk: { + // Important: for kevent to block properly, it needs an + // EMPTY changeset and a NON-EMPTY event set. + var changes: [0]std.os.Kevent = undefined; + var events: [1]std.os.Kevent = undefined; + _ = std.os.kevent( + fd, + &changes, + &events, + if (timeout < 0) null else &ts, + ) catch |err| blk: { log.err("kevent error: {}", .{err}); break :blk 0; };