]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host.c
host: Clean it up. Give some functions new names and new homes.
[xonotic/darkplaces.git] / host.c
diff --git a/host.c b/host.c
index 1bba0f9e9b83f86b9b8a7cc3c16961cdb5616e84..fa3c4911894d04441ef096a3a94bc59a5d31ab11 100644 (file)
--- a/host.c
+++ b/host.c
@@ -68,7 +68,6 @@ Host_AbortCurrentFrame
 aborts the current host frame and goes on with the next one
 ================
 */
-void Host_AbortCurrentFrame(void) DP_FUNC_NORETURN;
 void Host_AbortCurrentFrame(void)
 {
        // in case we were previously nice, make us mean again
@@ -182,44 +181,6 @@ static void SendCvar_f(cmd_state_t *cmd)
        }
 }
 
-/*
-=======================
-Host_InitLocal
-======================
-*/
-void Host_SaveConfig_f(cmd_state_t *cmd);
-void Host_LoadConfig_f(cmd_state_t *cmd);
-extern cvar_t sv_writepicture_quality;
-extern cvar_t r_texture_jpeg_fastpicmip;
-static void Host_InitLocal (void)
-{
-       Cmd_AddCommand(CF_SHARED, "quit", Host_Quit_f, "quit the game");
-       Cmd_AddCommand(CF_SHARED, "version", Host_Version_f, "print engine version");
-       Cmd_AddCommand(CF_SHARED, "saveconfig", Host_SaveConfig_f, "save settings to config.cfg (or a specified filename) immediately (also automatic when quitting)");
-       Cmd_AddCommand(CF_SHARED, "loadconfig", Host_LoadConfig_f, "reset everything and reload configs");
-       Cmd_AddCommand(CF_SHARED, "sendcvar", SendCvar_f, "sends the value of a cvar to the server as a sentcvar command, for use by QuakeC");
-       Cvar_RegisterVariable (&cl_maxphysicsframesperserverframe);
-       Cvar_RegisterVariable (&host_framerate);
-       Cvar_RegisterCallback (&host_framerate, Host_Framerate_c);
-       Cvar_RegisterVariable (&host_speeds);
-       Cvar_RegisterVariable (&host_maxwait);
-       Cvar_RegisterVariable (&host_isclient);
-
-       Cvar_RegisterVariable (&developer);
-       Cvar_RegisterVariable (&developer_extra);
-       Cvar_RegisterVariable (&developer_insane);
-       Cvar_RegisterVariable (&developer_loadfile);
-       Cvar_RegisterVariable (&developer_loading);
-       Cvar_RegisterVariable (&developer_entityparsing);
-
-       Cvar_RegisterVariable (&timestamps);
-       Cvar_RegisterVariable (&timeformat);
-
-       Cvar_RegisterVariable (&sv_writepicture_quality);
-       Cvar_RegisterVariable (&r_texture_jpeg_fastpicmip);
-}
-
-
 /*
 ===============
 Host_SaveConfig_f
@@ -227,7 +188,7 @@ Host_SaveConfig_f
 Writes key bindings and archived cvars to config.cfg
 ===============
 */
-static void Host_SaveConfig_to(const char *file)
+void Host_SaveConfig(const char *file)
 {
        qfile_t *f;
 
@@ -249,11 +210,8 @@ static void Host_SaveConfig_to(const char *file)
                FS_Close (f);
        }
 }
-void Host_SaveConfig(void)
-{
-       Host_SaveConfig_to(CONFIGFILENAME);
-}
-void Host_SaveConfig_f(cmd_state_t *cmd)
+
+static void Host_SaveConfig_f(cmd_state_t *cmd)
 {
        const char *file = CONFIGFILENAME;
 
@@ -262,7 +220,7 @@ void Host_SaveConfig_f(cmd_state_t *cmd)
                Con_Printf("Saving to %s\n", file);
        }
 
-       Host_SaveConfig_to(file);
+       Host_SaveConfig(file);
 }
 
 static void Host_AddConfigText(cmd_state_t *cmd)
@@ -287,7 +245,7 @@ Host_LoadConfig_f
 Resets key bindings and cvars to defaults and then reloads scripts
 ===============
 */
-void Host_LoadConfig_f(cmd_state_t *cmd)
+static void Host_LoadConfig_f(cmd_state_t *cmd)
 {
        // reset all cvars, commands and aliases to init values
        Cmd_RestoreInitState();
@@ -299,157 +257,39 @@ void Host_LoadConfig_f(cmd_state_t *cmd)
        Host_AddConfigText(cmd_local);
 }
 
-//============================================================================
-
-/*
-==================
-Host_TimeReport
-
-Returns a time report string, for example for
-==================
-*/
-const char *Host_TimingReport(char *buf, size_t buflen)
-{
-       return va(buf, buflen, "%.1f%% CPU, %.2f%% lost, offset avg %.1fms, max %.1fms, sdev %.1fms", svs.perf_cpuload * 100, svs.perf_lost * 100, svs.perf_offset_avg * 1000, svs.perf_offset_max * 1000, svs.perf_offset_sdev * 1000);
-}
-
 /*
-==================
-Host_Frame
-
-Runs all active servers
-==================
+=======================
+Host_InitLocal
+======================
 */
-static void Host_Init(void);
-double Host_Frame(double time)
-{
-       double cl_wait, sv_wait;
-
-       TaskQueue_Frame(false);
-
-       // keep the random time dependent, but not when playing demos/benchmarking
-       if(!*sv_random_seed.string && !host.restless)
-               rand();
-
-       NetConn_UpdateSockets();
-
-       Log_DestBuffer_Flush();
-
-       // Run any downloads
-       Curl_Frame();
-
-       // process console commands
-       Cbuf_Frame(host.cbuf);
-
-       R_TimeReport("---");
-
-       sv_wait = SV_Frame(time);
-       cl_wait = CL_Frame(time);
-
-//     Con_Printf("%6.0f %6.0f\n", cl_wait * 1000000.0, sv_wait * 1000000.0);
-
-       Mem_CheckSentinelsGlobal();
-
-       if(host.restless)
-               return 0;
-
-       // if the accumulators haven't become positive yet, wait a while
-       if (cls.state == ca_dedicated)
-               return sv_wait * -1000000.0; // dedicated
-       else if (!sv.active || svs.threaded)
-               return cl_wait * -1000000.0; // connected to server, main menu, or server is on different thread
-       else
-               return max(cl_wait, sv_wait) * -1000000.0; // listen server or singleplayer
-}
-
-static inline void Host_Sleep(double time)
-{
-       double delta, time0;
-
-       if(host_maxwait.value <= 0)
-               time = min(time, 1000000.0);
-       else
-               time = min(time, host_maxwait.value * 1000.0);
-       if(time < 1)
-               time = 1; // because we cast to int
-
-       time0 = Sys_DirtyTime();
-       if (sv_checkforpacketsduringsleep.integer && !sys_usenoclockbutbenchmark.integer && !svs.threaded) {
-               NetConn_SleepMicroseconds((int)time);
-               if (cls.state != ca_dedicated)
-                       NetConn_ClientFrame(); // helps server browser get good ping values
-               // TODO can we do the same for ServerFrame? Probably not.
-       }
-       else
-               Sys_Sleep((int)time);
-       delta = Sys_DirtyTime() - time0;
-       if (delta < 0 || delta >= 1800) 
-               delta = 0;
-       host.sleeptime += delta;
-//                     R_TimeReport("sleep");
-       return;
-}
-
-// Cloudwalk: Most overpowered function declaration...
-static inline double Host_UpdateTime (double newtime, double oldtime)
-{
-       double time = newtime - oldtime;
-
-       if (time < 0)
-       {
-               // warn if it's significant
-               if (time < -0.01)
-                       Con_Printf(CON_WARN "Host_UpdateTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, time);
-               time = 0;
-       }
-       else if (time >= 1800)
-       {
-               Con_Printf(CON_WARN "Host_UpdateTime: time stepped forward (went from %f to %f, difference %f)\n", oldtime, newtime, time);
-               time = 0;
-       }
-
-       return time;
-}
-
-void Host_Main(void)
+extern cvar_t r_texture_jpeg_fastpicmip;
+static void Host_InitLocal (void)
 {
-       double time, newtime, oldtime, sleeptime;
-
-       Host_Init(); // Start!
-
-       host.realtime = 0;
-       oldtime = Sys_DirtyTime();
-
-       // Main event loop
-       while(host.state != host_shutdown)
-       {
-               // Something bad happened, or the server disconnected
-               if (setjmp(host.abortframe))
-               {
-                       host.state = host_active; // In case we were loading
-                       continue;
-               }
-
-               newtime = host.dirtytime = Sys_DirtyTime();
-               host.realtime += time = Host_UpdateTime(newtime, oldtime);
-
-               sleeptime = Host_Frame(time);
-               oldtime = newtime;
+       Cmd_AddCommand(CF_SHARED, "quit", Host_Quit_f, "quit the game");
+       Cmd_AddCommand(CF_SHARED, "version", Host_Version_f, "print engine version");
+       Cmd_AddCommand(CF_SHARED, "saveconfig", Host_SaveConfig_f, "save settings to config.cfg (or a specified filename) immediately (also automatic when quitting)");
+       Cmd_AddCommand(CF_SHARED, "loadconfig", Host_LoadConfig_f, "reset everything and reload configs");
+       Cmd_AddCommand(CF_SHARED, "sendcvar", SendCvar_f, "sends the value of a cvar to the server as a sentcvar command, for use by QuakeC");
+       Cvar_RegisterVariable (&cl_maxphysicsframesperserverframe);
+       Cvar_RegisterVariable (&host_framerate);
+       Cvar_RegisterCallback (&host_framerate, Host_Framerate_c);
+       Cvar_RegisterVariable (&host_speeds);
+       Cvar_RegisterVariable (&host_maxwait);
+       Cvar_RegisterVariable (&host_isclient);
 
-               if (sleeptime >= 1)
-               {
-                       Host_Sleep(sleeptime);
-                       continue;
-               }
+       Cvar_RegisterVariable (&developer);
+       Cvar_RegisterVariable (&developer_extra);
+       Cvar_RegisterVariable (&developer_insane);
+       Cvar_RegisterVariable (&developer_loadfile);
+       Cvar_RegisterVariable (&developer_loading);
+       Cvar_RegisterVariable (&developer_entityparsing);
 
-               host.framecount++;
-       }
+       Cvar_RegisterVariable (&timestamps);
+       Cvar_RegisterVariable (&timeformat);
 
-       return;
+       Cvar_RegisterVariable (&r_texture_jpeg_fastpicmip);
 }
 
-//============================================================================
-
 char engineversion[128];
 
 qbool sys_nostdout = false;
@@ -476,6 +316,7 @@ static void Host_InitSession(void)
                }
        }
 }
+
 void Host_LockSession(void)
 {
        if(locksession_run)
@@ -501,6 +342,7 @@ void Host_LockSession(void)
                }
        }
 }
+
 void Host_UnlockSession(void)
 {
        if(!locksession_run)
@@ -713,7 +555,6 @@ static void Host_Init (void)
                SV_StartThread();
 }
 
-
 /*
 ===============
 Host_Shutdown
@@ -753,7 +594,7 @@ void Host_Shutdown(void)
        // AK shutdown PRVM
        // AK hmm, no PRVM_Shutdown(); yet
 
-       Host_SaveConfig();
+       Host_SaveConfig(CONFIGFILENAME);
 
        Curl_Shutdown ();
        NetConn_Shutdown ();
@@ -772,6 +613,138 @@ void Host_Shutdown(void)
        Memory_Shutdown();
 }
 
-void Host_NoOperation_f(cmd_state_t *cmd)
+//============================================================================
+
+/*
+==================
+Host_Frame
+
+Runs all active servers
+==================
+*/
+static double Host_Frame(double time)
 {
+       double cl_wait, sv_wait;
+
+       TaskQueue_Frame(false);
+
+       // keep the random time dependent, but not when playing demos/benchmarking
+       if(!*sv_random_seed.string && !host.restless)
+               rand();
+
+       NetConn_UpdateSockets();
+
+       Log_DestBuffer_Flush();
+
+       // Run any downloads
+       Curl_Frame();
+
+       // process console commands
+       Cbuf_Frame(host.cbuf);
+
+       R_TimeReport("---");
+
+       sv_wait = SV_Frame(time);
+       cl_wait = CL_Frame(time);
+
+//     Con_Printf("%6.0f %6.0f\n", cl_wait * 1000000.0, sv_wait * 1000000.0);
+
+       Mem_CheckSentinelsGlobal();
+
+       if(host.restless)
+               return 0;
+
+       // if the accumulators haven't become positive yet, wait a while
+       if (cls.state == ca_dedicated)
+               return sv_wait * -1000000.0; // dedicated
+       else if (!sv.active || svs.threaded)
+               return cl_wait * -1000000.0; // connected to server, main menu, or server is on different thread
+       else
+               return max(cl_wait, sv_wait) * -1000000.0; // listen server or singleplayer
+}
+
+static inline void Host_Sleep(double time)
+{
+       double delta, time0;
+
+       if(host_maxwait.value <= 0)
+               time = min(time, 1000000.0);
+       else
+               time = min(time, host_maxwait.value * 1000.0);
+       if(time < 1)
+               time = 1; // because we cast to int
+
+       time0 = Sys_DirtyTime();
+       if (sv_checkforpacketsduringsleep.integer && !sys_usenoclockbutbenchmark.integer && !svs.threaded) {
+               NetConn_SleepMicroseconds((int)time);
+               if (cls.state != ca_dedicated)
+                       NetConn_ClientFrame(); // helps server browser get good ping values
+               // TODO can we do the same for ServerFrame? Probably not.
+       }
+       else
+               Sys_Sleep((int)time);
+       delta = Sys_DirtyTime() - time0;
+       if (delta < 0 || delta >= 1800) 
+               delta = 0;
+       host.sleeptime += delta;
+//                     R_TimeReport("sleep");
+       return;
+}
+
+// Cloudwalk: Most overpowered function declaration...
+static inline double Host_UpdateTime (double newtime, double oldtime)
+{
+       double time = newtime - oldtime;
+
+       if (time < 0)
+       {
+               // warn if it's significant
+               if (time < -0.01)
+                       Con_Printf(CON_WARN "Host_UpdateTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, time);
+               time = 0;
+       }
+       else if (time >= 1800)
+       {
+               Con_Printf(CON_WARN "Host_UpdateTime: time stepped forward (went from %f to %f, difference %f)\n", oldtime, newtime, time);
+               time = 0;
+       }
+
+       return time;
+}
+
+void Host_Main(void)
+{
+       double time, newtime, oldtime, sleeptime;
+
+       Host_Init(); // Start!
+
+       host.realtime = 0;
+       oldtime = Sys_DirtyTime();
+
+       // Main event loop
+       while(host.state != host_shutdown)
+       {
+               // Something bad happened, or the server disconnected
+               if (setjmp(host.abortframe))
+               {
+                       host.state = host_active; // In case we were loading
+                       continue;
+               }
+
+               newtime = host.dirtytime = Sys_DirtyTime();
+               host.realtime += time = Host_UpdateTime(newtime, oldtime);
+
+               sleeptime = Host_Frame(time);
+               oldtime = newtime;
+
+               if (sleeptime >= 1)
+               {
+                       Host_Sleep(sleeptime);
+                       continue;
+               }
+
+               host.framecount++;
+       }
+
+       return;
 }