]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
Linux dedicated server: set nice -19 while spawning server (can be turned off by...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 26 Oct 2011 09:07:21 +0000 (09:07 +0000)
committerRudolf Polzer <divverent@xonotic.org>
Wed, 26 Oct 2011 09:28:33 +0000 (11:28 +0200)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11479 d7cf8633-e32d-0410-b094-e92efae38249
::stable-branch::merge=34964d5660d2c81ddbd9fa7659277e4944f972ce

host.c
sv_main.c
sys.h
sys_shared.c

diff --git a/host.c b/host.c
index f2e66e3a55f0f140eb233477485ef61e7459de45..4d27f3835f13f8b924b449655cac7526a3958c59 100644 (file)
--- 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();
 
index 7a2abb9b9a40a5c1781826afa6f6e51f50e26725..c69d5cb9453de58058450c516336c8cc707b7f39 100644 (file)
--- 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 37fcc8044fb87051d91eb7cfbd3e3715f7bfe2c1..dbc006f8f55401841de5803cfa13d1b469dc50cb 100644 (file)
--- 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
 
index bb6ce36bff76923f8f86178285578a92cfbdf061..aee4d8fb91116213293319402370439aeb80db45 100644 (file)
@@ -579,3 +579,70 @@ qboolean Sys_HaveSSE2(void)
        return false;
 }
 #endif
+
+/// called to set process priority for dedicated servers
+#if defined(__linux__)
+#include <sys/resource.h>
+#include <errno.h>
+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