authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-03 00:36:28+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-03 00:38:43+01:00
log8dda64fa3e1d3249baa948dc0558e3f65d71e6df
treebeceee28f51886280f8ede8caffb1475ad5e3edf
parent06b4526a3e15d776437cdcf45d76ed34c6c39272
signaturelock-open Commit is signed but in an unrecognized format.

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>

2 files changed, 11 insertions(+), 0 deletions(-)

lib/std/os/bits/darwin.zig+3
......@@ -1475,6 +1475,9 @@ pub const CLOCK_UPTIME_RAW_APPROX = 9;
14751475pub const CLOCK_PROCESS_CPUTIME_ID = 12;
14761476pub const CLOCK_THREAD_CPUTIME_ID = 16;
14771477
1478/// Max open files per process
1479/// https://opensource.apple.com/source/xnu/xnu-4903.221.2/bsd/sys/syslimits.h.auto.html
1480pub const OPEN_MAX = 10240;
14781481pub const RUSAGE_SELF = 0;
14791482pub const RUSAGE_CHILDREN = -1;
14801483
src/main.zig+8
......@@ -2986,6 +2986,14 @@ fn gimmeMoreOfThoseSweetSweetFileDescriptors() void {
29862986 const posix = std.os;
29872987
29882988 var lim = posix.getrlimit(.NOFILE) catch return; // Oh well; we tried.
2989 if (std.Target.current.isDarwin()) {
2990 // On Darwin, `NOFILE` is bounded by a hardcoded value `OPEN_MAX`.
2991 // According to the man pages for setrlimit():
2992 // setrlimit() now returns with errno set to EINVAL in places that historically succeeded.
2993 // It no longer accepts "rlim_cur = RLIM_INFINITY" for RLIM_NOFILE.
2994 // Use "rlim_cur = min(OPEN_MAX, rlim_max)".
2995 lim.max = std.math.min(posix.darwin.OPEN_MAX, lim.max);
2996 }
29892997 if (lim.cur == lim.max) return;
29902998
29912999 // Do a binary search for the limit.