diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-03 00:36:28 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-03 00:38:43 +0100 |
| commit | 8dda64fa3e1d3249baa948dc0558e3f65d71e6df (patch) | |
| tree | beceee28f51886280f8ede8caffb1475ad5e3edf /src/main.zig | |
| parent | 06b4526a3e15d776437cdcf45d76ed34c6c39272 (diff) | |
| download | zig-8dda64fa3e1d3249baa948dc0558e3f65d71e6df.tar.gz zig-8dda64fa3e1d3249baa948dc0558e3f65d71e6df.zip | |
Fix Darwin codepath
On Darwin, according to the man pages for setrlimit(), when adjusting
max number of open fds, the reported hard max by getrlimit() is only
theoretical, while the actual maximum, set in the kernel, is hardcoded
in the header file. Therefore, the reported max has to be adjusted
as `min(OPEN_MAX, lim.max)`.
Signed-off-by: Jakub Konka <kubkon@jakubkonka.com>
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/main.zig b/src/main.zig index 551f168683..90a0aba460 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2986,6 +2986,14 @@ fn gimmeMoreOfThoseSweetSweetFileDescriptors() void { const posix = std.os; var lim = posix.getrlimit(.NOFILE) catch return; // Oh well; we tried. + if (std.Target.current.isDarwin()) { + // On Darwin, `NOFILE` is bounded by a hardcoded value `OPEN_MAX`. + // According to the man pages for setrlimit(): + // setrlimit() now returns with errno set to EINVAL in places that historically succeeded. + // It no longer accepts "rlim_cur = RLIM_INFINITY" for RLIM_NOFILE. + // Use "rlim_cur = min(OPEN_MAX, rlim_max)". + lim.max = std.math.min(posix.darwin.OPEN_MAX, lim.max); + } if (lim.cur == lim.max) return; // Do a binary search for the limit. |
