zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8dda64fa3e1d3249baa948dc0558e3f65d71e6df (tree)
parent 06b4526a3e15d776437cdcf45d76ed34c6c39272
Author: Jakub Konka <kubkon@jakubkonka.com>
Date:   Tue,  3 Nov 2020 00:36:28 +0100

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:
Mlib/std/os/bits/darwin.zig | 3+++
Msrc/main.zig | 8++++++++
2 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/lib/std/os/bits/darwin.zig b/lib/std/os/bits/darwin.zig @@ -1475,6 +1475,9 @@ pub const CLOCK_UPTIME_RAW_APPROX = 9; pub const CLOCK_PROCESS_CPUTIME_ID = 12; pub const CLOCK_THREAD_CPUTIME_ID = 16; +/// Max open files per process +/// https://opensource.apple.com/source/xnu/xnu-4903.221.2/bsd/sys/syslimits.h.auto.html +pub const OPEN_MAX = 10240; pub const RUSAGE_SELF = 0; pub const RUSAGE_CHILDREN = -1; diff --git 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.