From 1def4f255214c74317cc871b2f4cbfd10d0302e6 Mon Sep 17 00:00:00 2001 From: divverent Date: Wed, 26 Oct 2011 09:07:21 +0000 Subject: [PATCH] Linux dedicated server: set nice -19 while spawning server (can be turned off by -nonice option) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11479 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=34964d5660d2c81ddbd9fa7659277e4944f972ce --- host.c | 6 +++++ sv_main.c | 10 ++++++++ sys.h | 5 ++++ sys_shared.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+) diff --git a/host.c b/host.c index f2e66e3a..4d27f383 100644 --- a/host.c +++ b/host.c @@ -92,6 +92,9 @@ aborts the current host frame and goes on with the next one */ void Host_AbortCurrentFrame(void) { + // in case we were previously nice, make us mean again + Sys_MakeProcessMean(); + longjmp (host_abortframe, 1); } @@ -1140,6 +1143,9 @@ static void Host_Init (void) dpsnprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring); Con_Printf("%s\n", engineversion); + // initialize process nice level + Sys_InitProcessNice(); + // initialize ixtable Mathlib_Init(); diff --git a/sv_main.c b/sv_main.c index 7a2abb9b..c69d5cb9 100644 --- a/sv_main.c +++ b/sv_main.c @@ -3192,6 +3192,9 @@ void SV_SpawnServer (const char *server) } } + if(cls.state == ca_dedicated) + Sys_MakeProcessNice(); + if (cls.state != ca_dedicated) { SCR_BeginLoadingPlaque(); @@ -3218,6 +3221,10 @@ void SV_SpawnServer (const char *server) if (!worldmodel || !worldmodel->TraceBox) { Con_Printf("Couldn't load map %s\n", modelname); + + if(cls.state == ca_dedicated) + Sys_MakeProcessMean(); + return; } @@ -3465,6 +3472,9 @@ void SV_SpawnServer (const char *server) NetConn_Heartbeat (2); SV_VM_End(); + + if(cls.state == ca_dedicated) + Sys_MakeProcessMean(); } ///////////////////////////////////////////////////// diff --git a/sys.h b/sys.h index 37fcc804..dbc006f8 100644 --- a/sys.h +++ b/sys.h @@ -102,5 +102,10 @@ extern qboolean sys_supportsdlgetticks; unsigned int Sys_SDL_GetTicks (void); // wrapper to call SDL_GetTicks void Sys_SDL_Delay (unsigned int milliseconds); // wrapper to call SDL_Delay +/// called to set process priority for dedicated servers +void Sys_InitProcessNice (void); +void Sys_MakeProcessNice (void); +void Sys_MakeProcessMean (void); + #endif diff --git a/sys_shared.c b/sys_shared.c index bb6ce36b..aee4d8fb 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -579,3 +579,70 @@ qboolean Sys_HaveSSE2(void) return false; } #endif + +/// called to set process priority for dedicated servers +#if defined(__linux__) +#include +#include +static int nicelevel; +static qboolean nicepossible; +static qboolean isnice; +void Sys_InitProcessNice (void) +{ + struct rlimit lim; + nicepossible = false; + if(COM_CheckParm("-nonice")) + return; + errno = 0; + nicelevel = getpriority(PRIO_PROCESS, 0); + if(errno) + { + Con_Printf("Kernel does not support reading process priority - cannot use niceness\n"); + return; + } + if(getrlimit(RLIMIT_NICE, &lim)) + { + Con_Printf("Kernel does not support lowering nice level again - cannot use niceness\n"); + return; + } + if(lim.rlim_cur != RLIM_INFINITY && nicelevel < (int) (20 - lim.rlim_cur)) + { + Con_Printf("Current nice level is below the soft limit - cannot use niceness\n"); + return; + } + nicepossible = true; + isnice = false; +} +void Sys_MakeProcessNice (void) +{ + if(!nicepossible) + return; + if(isnice) + return; + Con_DPrintf("Process is becoming 'nice'...\n"); + if(setpriority(PRIO_PROCESS, 0, 19)) + Con_Printf("Failed to raise nice level to %d\n", 19); + isnice = true; +} +void Sys_MakeProcessMean (void) +{ + if(!nicepossible) + return; + if(!isnice) + return; + Con_DPrintf("Process is becoming 'mean'...\n"); + if(setpriority(PRIO_PROCESS, 0, nicelevel)) + Con_Printf("Failed to lower nice level to %d\n", nicelevel); + isnice = false; +} +#else +void Sys_InitProcessNice (void) +{ +} +void Sys_MakeProcessNice (void) +{ +} +void Sys_MakeProcessMean (void) +{ +} +#endif -- 2.39.2