Split from https://gitlab.winehq.org/wine/wine/-/merge_requests/8875
-- v5: wineserver: Request RLIMIT_NOFILE maximum allowed value. ntdll: Remove workaround for macOS RLIMIT_NOFILE.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/ntdll/unix/loader.c | 31 ------------------------------- 1 file changed, 31 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index c06618db64d..01e04293d29 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -216,37 +216,6 @@ static void set_max_limit( int limit ) if (!setrlimit( limit, &rlimit )) return;
-#if defined(__APPLE__) && defined(RLIMIT_NOFILE) && defined(OPEN_MAX) - if (limit == RLIMIT_NOFILE) - { - unsigned int nlimit = 0; - size_t size; - - /* On Leopard, setrlimit(RLIMIT_NOFILE, ...) fails on attempts to set - * rlim_cur above OPEN_MAX (even if rlim_max > OPEN_MAX). - * - * In later versions it can be set to kern.maxfilesperproc (from - * sysctl). In Big Sur and later it can be set to rlim_max. */ - size = sizeof(nlimit); - if (sysctlbyname("kern.maxfilesperproc", &nlimit, &size, NULL, 0) != 0 || nlimit < OPEN_MAX) - rlimit.rlim_cur = OPEN_MAX; - else - rlimit.rlim_cur = nlimit; - - if (!setrlimit( limit, &rlimit )) - { - TRACE("Fallback 1: RLIMIT_NOFILE to kern.maxfilesperproc\n"); - return; - } - - rlimit.rlim_cur = OPEN_MAX; - if (!setrlimit( limit, &rlimit )) - { - TRACE("Fallback 2: RLIMIT_NOFILE to OPEN_MAX(%d)\n", OPEN_MAX); - return; - } - } -#endif WARN("Failed to raise limit %d\n", limit); } }
From: Rémi Bernon rbernon@codeweavers.com
For when wineserver is started separately from any wine process, where it doesn't inherit the limits otherwise requested from __wine_main. --- server/main.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/server/main.c b/server/main.c index e014ec535ff..be53cc5c4d5 100644 --- a/server/main.c +++ b/server/main.c @@ -28,6 +28,12 @@ #include <stdlib.h> #include <sys/time.h> #include <unistd.h> +#ifdef HAVE_SYS_RESOURCE_H +# include <sys/resource.h> +#endif +#ifdef HAVE_SYS_SYSCTL_H +# include <sys/sysctl.h> +#endif
#include "object.h" #include "file.h" @@ -212,6 +218,19 @@ static void sigterm_handler( int signum ) exit(1); /* make sure atexit functions get called */ }
+static void init_limits(void) +{ +#ifdef RLIMIT_NOFILE + struct rlimit rlimit; + + if (!getrlimit( RLIMIT_NOFILE, &rlimit )) + { + rlimit.rlim_cur = rlimit.rlim_max; + setrlimit( RLIMIT_NOFILE, &rlimit ); + } +#endif +} + int main( int argc, char *argv[] ) { setvbuf( stderr, NULL, _IOLBF, 0 ); @@ -225,6 +244,7 @@ int main( int argc, char *argv[] ) signal( SIGQUIT, sigterm_handler ); signal( SIGTERM, sigterm_handler ); signal( SIGABRT, sigterm_handler ); + init_limits();
sock_init(); open_master_socket();
V5: Remove macOS workaround.