[openjk] 01/11: Use NET_Sleep() (or Sys_Sleep() for SP) to avoid busy-waiting
Simon McVittie
smcv at debian.org
Sun Jan 4 21:54:42 UTC 2015
This is an automated email from the git hooks/post-receive script.
smcv pushed a commit to branch master
in repository openjk.
commit 8e38f7533772cdcb7d712f6b9c9b58b3580d6c46
Author: Simon McVittie <smcv at debian.org>
Date: Wed Dec 31 01:01:04 2014 +0000
Use NET_Sleep() (or Sys_Sleep() for SP) to avoid busy-waiting
---
...ep-or-Sys_Sleep-for-SP-to-avoid-busy-wait.patch | 801 +++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 802 insertions(+)
diff --git a/debian/patches/Use-NET_Sleep-or-Sys_Sleep-for-SP-to-avoid-busy-wait.patch b/debian/patches/Use-NET_Sleep-or-Sys_Sleep-for-SP-to-avoid-busy-wait.patch
new file mode 100644
index 0000000..117bb96
--- /dev/null
+++ b/debian/patches/Use-NET_Sleep-or-Sys_Sleep-for-SP-to-avoid-busy-wait.patch
@@ -0,0 +1,801 @@
+From: Simon McVittie <smcv at debian.org>
+Date: Wed, 31 Dec 2014 01:00:21 +0000
+Subject: Use NET_Sleep() (or Sys_Sleep() for SP) to avoid busy-waiting
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Backported and simplified from an assortment of ioquake3 commits,
+mostly by Thilo Schulz, with contributions from Zack Middleton and
+Özkan Sezer.
+---
+ code/qcommon/common.cpp | 91 +++++++++++++++++++++------------
+ code/qcommon/qcommon.h | 6 +--
+ code/win32/win_main.cpp | 8 +++
+ codemp/null/null_net.c | 11 ----
+ codemp/qcommon/common.cpp | 116 +++++++++++++++++++++++++-----------------
+ codemp/qcommon/net_ip.cpp | 92 ++++++++++++++++++++++++++++-----
+ codemp/qcommon/qcommon.h | 6 +--
+ codemp/server/sv_main.cpp | 32 +++++++++---
+ codemp/sys/sys_unix.cpp | 17 -------
+ codemp/win32/win_main.cpp | 18 -------
+ codemp/win32/win_main_ded.cpp | 16 ------
+ 11 files changed, 243 insertions(+), 170 deletions(-)
+
+diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp
+index fb33c65..bf8a496 100644
+--- a/code/qcommon/common.cpp
++++ b/code/qcommon/common.cpp
+@@ -53,6 +53,7 @@ cvar_t *sv_paused;
+ cvar_t *com_skippingcin;
+ cvar_t *com_speedslog; // 1 = buffer log, 2 = flush after each print
+ cvar_t *com_homepath;
++cvar_t *com_busyWait;
+
+ #ifdef G2_PERFORMANCE_ANALYSIS
+ cvar_t *com_G2Report;
+@@ -70,7 +71,6 @@ int timeInPVSCheck;
+ int numTraces;
+
+ int com_frameTime;
+-int com_frameMsec;
+ int com_frameNumber = 0;
+
+ qboolean com_errorEntered = qfalse;
+@@ -873,25 +873,6 @@ int Com_EventLoop( void ) {
+ Cbuf_AddText( (char *)ev.evPtr );
+ Cbuf_AddText( "\n" );
+ break;
+- case SE_PACKET:
+- evFrom = *(netadr_t *)ev.evPtr;
+- buf.cursize = ev.evPtrLength - sizeof( evFrom );
+-
+- // we must copy the contents of the message out, because
+- // the event buffers are only large enough to hold the
+- // exact payload, but channel messages need to be large
+- // enough to hold fragment reassembly
+- if ( (unsigned)buf.cursize > (unsigned)buf.maxsize ) {
+- Com_Printf("Com_EventLoop: oversize packet\n");
+- continue;
+- }
+- memcpy( buf.data, (byte *)((netadr_t *)ev.evPtr + 1), buf.cursize );
+- if ( com_sv_running->integer ) {
+- Com_RunAndTimeServerPacket( &evFrom, &buf );
+- } else {
+- CL_PacketEvent( evFrom, &buf );
+- }
+- break;
+ }
+
+ // free any block data
+@@ -1160,6 +1141,7 @@ void Com_Init( char *commandLine ) {
+ com_buildScript = Cvar_Get( "com_buildScript", "0", 0 );
+
+ com_affinity = Cvar_Get( "com_affinity", "1", CVAR_ARCHIVE );
++ com_busyWait = Cvar_Get( "com_busyWait", "0", CVAR_ARCHIVE );
+
+ com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE );
+
+@@ -1350,6 +1332,26 @@ int Com_ModifyMsec( int msec, float &fraction )
+
+ /*
+ =================
++Com_TimeVal
++=================
++*/
++
++int Com_TimeVal(int minMsec)
++{
++ int timeVal;
++
++ timeVal = Sys_Milliseconds() - com_frameTime;
++
++ if(timeVal >= minMsec)
++ timeVal = 0;
++ else
++ timeVal = minMsec - timeVal;
++
++ return timeVal;
++}
++
++/*
++=================
+ Com_Frame
+ =================
+ */
+@@ -1375,7 +1377,8 @@ void Com_Frame( void ) {
+ {
+ int timeBeforeFirstEvents = 0, timeBeforeServer = 0, timeBeforeEvents = 0, timeBeforeClient = 0, timeAfter = 0;
+ int msec, minMsec;
+- static int lastTime = 0;
++ int timeVal;
++ static int lastTime = 0, bias = 0;
+
+ // write config file if anything changed
+ Com_WriteConfiguration();
+@@ -1393,25 +1396,47 @@ void Com_Frame( void ) {
+ timeBeforeFirstEvents = Sys_Milliseconds ();
+ }
+
+- // we may want to spin here if things are going too fast
+- if ( com_maxfps->integer > 0 ) {
++// Figure out how much time we have
++#if 0
++ // FIXME: enable this ioquake3 feature one day
++ if(com_minimized->integer && com_maxfpsMinimized->integer > 0)
++ minMsec = 1000 / com_maxfpsMinimized->integer;
++ else if(com_unfocused->integer && com_maxfpsUnfocused->integer > 0)
++ minMsec = 1000 / com_maxfpsUnfocused->integer;
++ else
++#endif
++ if(com_maxfps->integer > 0)
+ minMsec = 1000 / com_maxfps->integer;
+- } else {
++ else
+ minMsec = 1;
+- }
++
++ timeVal = com_frameTime - lastTime;
++ bias += timeVal - minMsec;
++
++ if (bias > minMsec)
++ bias = minMsec;
++
++ // Adjust minMsec if previous frame took too long to render so
++ // that framerate is stable at the requested value.
++ minMsec -= bias;
++
++ timeVal = Com_TimeVal(minMsec);
+ do {
+- com_frameTime = Com_EventLoop();
+- if ( lastTime > com_frameTime ) {
+- lastTime = com_frameTime; // possible on first frame
+- }
+- msec = com_frameTime - lastTime;
+- } while ( msec < minMsec );
+- Cbuf_Execute ();
++ // Busy sleep the last millisecond for better timeout precision
++ if(com_busyWait->integer || timeVal < 1)
++ Sys_Sleep(0);
++ else
++ Sys_Sleep(timeVal - 1);
++ } while( (timeVal = Com_TimeVal(minMsec)) != 0 );
+
+ lastTime = com_frameTime;
++ com_frameTime = Com_EventLoop();
++
++ msec = com_frameTime - lastTime;
++
++ Cbuf_Execute ();
+
+ // mess with msec if needed
+- com_frameMsec = msec;
+ float fractionMsec=0.0f;
+ msec = Com_ModifyMsec( msec, fractionMsec);
+
+diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h
+index 2f87978..f1ed20e 100644
+--- a/code/qcommon/qcommon.h
++++ b/code/qcommon/qcommon.h
+@@ -572,6 +572,7 @@ unsigned Com_BlockChecksum( const void *buffer, int length );
+ int Com_Filter(const char *filter, const char *name, int casesensitive);
+ int Com_FilterPath(const char *filter, const char *name, int casesensitive);
+ qboolean Com_SafeMode( void );
++void Com_RunAndTimeServerPacket(netadr_t *evFrom, msg_t *buf);
+
+ void Com_StartupVariable( const char *match );
+ // checks for and removes command line "+set var arg" constructs
+@@ -602,7 +603,6 @@ extern int timeInPVSCheck;
+ extern int numTraces;
+
+ extern int com_frameTime;
+-extern int com_frameMsec;
+
+ extern qboolean com_errorEntered;
+
+@@ -778,8 +778,7 @@ typedef enum {
+ SE_CHAR, // evValue is an ascii char
+ SE_MOUSE, // evValue and evValue2 are reletive signed x / y moves
+ SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127)
+- SE_CONSOLE, // evPtr is a char*
+- SE_PACKET // evPtr is a netadr_t followed by data bytes to evPtrLength
++ SE_CONSOLE // evPtr is a char*
+ } sysEventType_t;
+
+ typedef struct {
+@@ -843,6 +842,7 @@ const char *Sys_Basename( char *path );
+
+ char **Sys_ListFiles( const char *directory, const char *extension, char *filter, int *numfiles, qboolean wantsubs );
+ void Sys_FreeFileList( char **filelist );
++void Sys_Sleep(int msec);
+
+ qboolean Sys_LowPhysicalMemory();
+ qboolean Sys_FileOutOfDate( const char *psFinalFileName /* dest */, const char *psDataFileName /* src */ );
+diff --git a/code/win32/win_main.cpp b/code/win32/win_main.cpp
+index d29bc54..e063593 100644
+--- a/code/win32/win_main.cpp
++++ b/code/win32/win_main.cpp
+@@ -1037,6 +1037,14 @@ static int ParseCommandLine(char *cmdline, char **argv)
+ //=======================================================================
+ //int totalMsec, countMsec;
+
++void Sys_Sleep( int msec )
++{
++ if( msec <= 0 )
++ return;
++
++ Sleep( msec );
++}
++
+ #ifndef DEFAULT_BASEDIR
+ # define DEFAULT_BASEDIR Sys_BinaryPath()
+ #endif
+diff --git a/codemp/null/null_net.c b/codemp/null/null_net.c
+index c8abf18..37a012a 100644
+--- a/codemp/null/null_net.c
++++ b/codemp/null/null_net.c
+@@ -30,14 +30,3 @@ Sys_SendPacket
+ */
+ void Sys_SendPacket( int length, void *data, netadr_t to ) {
+ }
+-
+-/*
+-==================
+-Sys_GetPacket
+-
+-Never called by the game logic, just the system event queing
+-==================
+-*/
+-qboolean Sys_GetPacket ( netadr_t *net_from, msg_t *net_message ) {
+- return false;
+-}
+diff --git a/codemp/qcommon/common.cpp b/codemp/qcommon/common.cpp
+index 55e15f9..f972d6b 100644
+--- a/codemp/qcommon/common.cpp
++++ b/codemp/qcommon/common.cpp
+@@ -18,7 +18,6 @@ cvar_t *com_developer;
+ cvar_t *com_dedicated;
+ cvar_t *com_timescale;
+ cvar_t *com_fixedtime;
+-cvar_t *com_dropsim; // 0.0 to 1.0, simulated packet drops
+ cvar_t *com_journal;
+ cvar_t *com_maxfps;
+ cvar_t *com_timedemo;
+@@ -44,6 +43,7 @@ cvar_t *com_minimized;
+ cvar_t *com_homepath;
+
+ cvar_t *com_affinity;
++cvar_t *com_busyWait;
+
+ // com_speeds times
+ int time_game;
+@@ -51,7 +51,6 @@ int time_frontend; // renderer frontend time
+ int time_backend; // renderer backend time
+
+ int com_frameTime;
+-int com_frameMsec;
+ int com_frameNumber;
+
+ qboolean com_errorEntered = qfalse;
+@@ -897,36 +896,6 @@ int Com_EventLoop( void ) {
+ }
+ Cbuf_AddText( "\n" );
+ break;
+- case SE_PACKET:
+- // this cvar allows simulation of connections that
+- // drop a lot of packets. Note that loopback connections
+- // don't go through here at all.
+- if ( com_dropsim->value > 0 ) {
+- static int seed;
+-
+- if ( Q_random( &seed ) < com_dropsim->value ) {
+- break; // drop this packet
+- }
+- }
+-
+- evFrom = *(netadr_t *)ev.evPtr;
+- buf.cursize = ev.evPtrLength - sizeof( evFrom );
+-
+- // we must copy the contents of the message out, because
+- // the event buffers are only large enough to hold the
+- // exact payload, but channel messages need to be large
+- // enough to hold fragment reassembly
+- if ( (unsigned)buf.cursize > (unsigned)buf.maxsize ) {
+- Com_Printf("Com_EventLoop: oversize packet\n");
+- continue;
+- }
+- Com_Memcpy( buf.data, (byte *)((netadr_t *)ev.evPtr + 1), buf.cursize );
+- if ( com_sv_running->integer ) {
+- Com_RunAndTimeServerPacket( &evFrom, &buf );
+- } else {
+- CL_PacketEvent( evFrom, &buf );
+- }
+- break;
+ }
+
+ // free any block data
+@@ -1222,7 +1191,6 @@ void Com_Init( char *commandLine ) {
+ com_fixedtime = Cvar_Get ("fixedtime", "0", CVAR_CHEAT);
+ com_showtrace = Cvar_Get ("com_showtrace", "0", CVAR_CHEAT);
+
+- com_dropsim = Cvar_Get ("com_dropsim", "0", CVAR_CHEAT);
+ com_viewlog = Cvar_Get( "viewlog", "0", 0 );
+ com_speeds = Cvar_Get ("com_speeds", "0", 0);
+ com_timedemo = Cvar_Get ("timedemo", "0", 0);
+@@ -1244,6 +1212,7 @@ void Com_Init( char *commandLine ) {
+ #endif
+
+ com_affinity = Cvar_Get( "com_affinity", "1", CVAR_ARCHIVE );
++ com_busyWait = Cvar_Get( "com_busyWait", "0", CVAR_ARCHIVE );
+
+ com_bootlogo = Cvar_Get( "com_bootlogo", "1", CVAR_ARCHIVE);
+
+@@ -1442,6 +1411,26 @@ extern int G2Time_PreciseFrame;
+
+ /*
+ =================
++Com_TimeVal
++=================
++*/
++
++int Com_TimeVal(int minMsec)
++{
++ int timeVal;
++
++ timeVal = Sys_Milliseconds() - com_frameTime;
++
++ if(timeVal >= minMsec)
++ timeVal = 0;
++ else
++ timeVal = minMsec - timeVal;
++
++ return timeVal;
++}
++
++/*
++=================
+ Com_Frame
+ =================
+ */
+@@ -1453,7 +1442,8 @@ void Com_Frame( void ) {
+ G2PerformanceTimer_PreciseFrame.Start();
+ #endif
+ int msec, minMsec;
+- static int lastTime = 0;
++ int timeVal;
++ static int lastTime = 0, bias = 0;
+
+ int timeBeforeFirstEvents;
+ int timeBeforeServer;
+@@ -1488,25 +1478,57 @@ void Com_Frame( void ) {
+ timeBeforeFirstEvents = Sys_Milliseconds ();
+ }
+
+- // we may want to spin here if things are going too fast
+- if ( !com_dedicated->integer && com_maxfps->integer > 0 && !com_timedemo->integer ) {
+- minMsec = 1000 / com_maxfps->integer;
+- } else {
+- minMsec = 1;
++ // Figure out how much time we have
++ if(!com_timedemo->integer)
++ {
++ if(com_dedicated->integer)
++ minMsec = SV_FrameMsec();
++ else
++ {
++#if 0
++ // FIXME: enable this ioquake3 feature one day
++ if(com_minimized->integer && com_maxfpsMinimized->integer > 0)
++ minMsec = 1000 / com_maxfpsMinimized->integer;
++ else if(com_unfocused->integer && com_maxfpsUnfocused->integer > 0)
++ minMsec = 1000 / com_maxfpsUnfocused->integer;
++ else
++#endif
++ if(com_maxfps->integer > 0)
++ minMsec = 1000 / com_maxfps->integer;
++ else
++ minMsec = 1;
++
++ timeVal = com_frameTime - lastTime;
++ bias += timeVal - minMsec;
++
++ if (bias > minMsec)
++ bias = minMsec;
++
++ // Adjust minMsec if previous frame took too long to render so
++ // that framerate is stable at the requested value.
++ minMsec -= bias;
++ }
+ }
++ else
++ minMsec = 1;
++
++ timeVal = Com_TimeVal(minMsec);
+ do {
+- com_frameTime = Com_EventLoop();
+- if ( lastTime > com_frameTime ) {
+- lastTime = com_frameTime; // possible on first frame
+- }
+- msec = com_frameTime - lastTime;
+- } while ( msec < minMsec );
+- Cbuf_Execute ();
++ // Busy sleep the last millisecond for better timeout precision
++ if(com_busyWait->integer || timeVal < 1)
++ NET_Sleep(0);
++ else
++ NET_Sleep(timeVal - 1);
++ } while( (timeVal = Com_TimeVal(minMsec)) != 0 );
+
+ lastTime = com_frameTime;
++ com_frameTime = Com_EventLoop();
++
++ msec = com_frameTime - lastTime;
++
++ Cbuf_Execute ();
+
+ // mess with msec if needed
+- com_frameMsec = msec;
+ msec = Com_ModifyMsec( msec );
+
+ //
+diff --git a/codemp/qcommon/net_ip.cpp b/codemp/qcommon/net_ip.cpp
+index 77b68a5..d405cda 100644
+--- a/codemp/qcommon/net_ip.cpp
++++ b/codemp/qcommon/net_ip.cpp
+@@ -71,6 +71,8 @@ static cvar_t *net_socksPassword;
+ static cvar_t *net_ip;
+ static cvar_t *net_port;
+
++static cvar_t *net_dropsim;
++
+ static struct sockaddr socksRelayAddr;
+
+ static SOCKET ip_socket = INVALID_SOCKET;
+@@ -213,21 +215,21 @@ qboolean Sys_StringToAdr( const char *s, netadr_t *a ) {
+
+ /*
+ ==================
+-Sys_GetPacket
++NET_GetPacket
+
+-Never called by the game logic, just the system event queing
++Receive one packet
+ ==================
+ */
+ #ifdef _DEBUG
+ int recvfromCount;
+ #endif
+
+-qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ) {
++qboolean NET_GetPacket( netadr_t *net_from, msg_t *net_message, fd_set *fdr ) {
+ int ret, err;
+ socklen_t fromlen;
+ struct sockaddr from;
+
+- if ( ip_socket == INVALID_SOCKET ) {
++ if ( ip_socket == INVALID_SOCKET || !FD_ISSET(ip_socket, fdr) ) {
+ return qfalse;
+ }
+
+@@ -878,6 +880,8 @@ static qboolean NET_GetCvars( void ) {
+ modified += net_socksPassword->modified;
+ net_socksPassword->modified = qfalse;
+
++ net_dropsim = Cvar_Get( "net_dropsim", "", CVAR_TEMP);
++
+ return modified ? qtrue : qfalse;
+ }
+
+@@ -982,31 +986,91 @@ void NET_Shutdown( void ) {
+
+ /*
+ ====================
++NET_Event
++
++Called from NET_Sleep which uses select() to determine which sockets have seen action.
++====================
++*/
++
++void NET_Event(fd_set *fdr)
++{
++ byte bufData[MAX_MSGLEN + 1];
++ netadr_t from;
++ msg_t netmsg;
++
++ while(1)
++ {
++ MSG_Init(&netmsg, bufData, sizeof(bufData));
++
++ if(NET_GetPacket(&from, &netmsg, fdr))
++ {
++ if(net_dropsim->value > 0.0f && net_dropsim->value <= 100.0f)
++ {
++ // com_dropsim->value percent of incoming packets get dropped.
++ if(rand() < (int) (((double) RAND_MAX) / 100.0 * (double) net_dropsim->value))
++ continue; // drop this packet
++ }
++
++ if(com_sv_running->integer)
++ Com_RunAndTimeServerPacket(&from, &netmsg);
++ else
++ CL_PacketEvent(from, &netmsg);
++ }
++ else
++ break;
++ }
++}
++
++/*
++====================
+ NET_Sleep
+
+ sleeps msec or until net socket is ready
+ ====================
+ */
+ void NET_Sleep( int msec ) {
+-#ifndef _WIN32
+ struct timeval timeout;
+ fd_set fdset;
++ int retval;
++ SOCKET highestfd = INVALID_SOCKET;
++#ifndef _WIN32
+ extern qboolean stdin_active;
++#endif
+
+- if ( !com_dedicated->integer )
+- return; // we're not a server, just run full speed
+-
+- if ( ip_socket == INVALID_SOCKET )
+- return;
++ if (msec < 0)
++ msec = 0;
+
+ FD_ZERO(&fdset);
+- if (stdin_active)
++#ifndef _WIN32
++ if (stdin_active) {
+ FD_SET(0, &fdset); // stdin is processed too
+- FD_SET(ip_socket, &fdset); // network socket
++ highestfd = 0;
++ }
++#endif
++ if (ip_socket != INVALID_SOCKET) {
++ FD_SET(ip_socket, &fdset); // network socket
++ highestfd = ip_socket;
++ }
++
++#ifdef _WIN32
++ if(highestfd == INVALID_SOCKET)
++ {
++ // windows ain't happy when select is called without valid FDs
++
++ SleepEx(msec, 0);
++ return;
++ }
++#endif
++
+ timeout.tv_sec = msec/1000;
+ timeout.tv_usec = (msec%1000)*1000;
+- select(ip_socket+1, &fdset, NULL, NULL, &timeout);
+-#endif
++
++ retval = select(highestfd + 1, &fdset, NULL, NULL, &timeout);
++
++ if(retval == SOCKET_ERROR)
++ Com_Printf("Warning: select() syscall failed: %s\n", NET_ErrorString());
++ else if(retval > 0)
++ NET_Event(&fdset);
+ }
+
+ /*
+diff --git a/codemp/qcommon/qcommon.h b/codemp/qcommon/qcommon.h
+index 70522de..6cf7fcf 100644
+--- a/codemp/qcommon/qcommon.h
++++ b/codemp/qcommon/qcommon.h
+@@ -733,6 +733,7 @@ int Com_Filter(char *filter, char *name, int casesensitive);
+ int Com_FilterPath(char *filter, char *name, int casesensitive);
+ int Com_RealTime(qtime_t *qtime);
+ qboolean Com_SafeMode( void );
++void Com_RunAndTimeServerPacket(netadr_t *evFrom, msg_t *buf);
+
+ void Com_StartupVariable( const char *match );
+ // checks for and removes command line "+set var arg" constructs
+@@ -773,7 +774,6 @@ extern int time_frontend;
+ extern int time_backend; // renderer backend time
+
+ extern int com_frameTime;
+-extern int com_frameMsec;
+
+ extern qboolean com_errorEntered;
+
+@@ -953,6 +953,7 @@ void SV_Init( void );
+ void SV_Shutdown( char *finalmsg );
+ void SV_Frame( int msec );
+ void SV_PacketEvent( netadr_t from, msg_t *msg );
++int SV_FrameMsec( void );
+ qboolean SV_GameCommand( void );
+
+
+@@ -986,8 +987,7 @@ typedef enum {
+ SE_CHAR, // evValue is an ascii char
+ SE_MOUSE, // evValue and evValue2 are reletive signed x / y moves
+ SE_JOYSTICK_AXIS, // evValue is an axis number and evValue2 is the current state (-127 to 127)
+- SE_CONSOLE, // evPtr is a char*
+- SE_PACKET // evPtr is a netadr_t followed by data bytes to evPtrLength
++ SE_CONSOLE // evPtr is a char*
+ } sysEventType_t;
+
+ typedef struct sysEvent_s {
+diff --git a/codemp/server/sv_main.cpp b/codemp/server/sv_main.cpp
+index 1e77dd1..c87f8a3 100644
+--- a/codemp/server/sv_main.cpp
++++ b/codemp/server/sv_main.cpp
+@@ -8,7 +8,7 @@ server_t sv; // local server
+
+ cvar_t *sv_snapsMin; // minimum snapshots/sec a client can request, also limited by sv_snapsMax
+ cvar_t *sv_snapsMax; // maximum snapshots/sec a client can request, also limited by sv_fps
+-cvar_t *sv_fps; // time rate for running non-clients
++cvar_t *sv_fps = NULL; // time rate for running non-clients
+ cvar_t *sv_timeout; // seconds without any message
+ cvar_t *sv_zombietime; // seconds to sink messages after disconnect
+ cvar_t *sv_rconPassword; // password for remote server commands
+@@ -995,6 +995,29 @@ void SV_CheckCvars( void ) {
+
+ /*
+ ==================
++SV_FrameMsec
++Return time in millseconds until processing of the next server frame.
++==================
++*/
++int SV_FrameMsec()
++{
++ if(sv_fps)
++ {
++ int frameMsec;
++
++ frameMsec = 1000.0f / sv_fps->value;
++
++ if(frameMsec < sv.timeResidual)
++ return 0;
++ else
++ return frameMsec - sv.timeResidual;
++ }
++ else
++ return 1;
++}
++
++/*
++==================
+ SV_Frame
+
+ Player movement occurs as a result of packet events, which
+@@ -1037,13 +1060,6 @@ void SV_Frame( int msec ) {
+
+ if (!com_dedicated->integer) SV_BotFrame( sv.time + sv.timeResidual );
+
+- if ( com_dedicated->integer && sv.timeResidual < frameMsec && (!com_timescale || com_timescale->value >= 1) ) {
+- // NET_Sleep will give the OS time slices until either get a packet
+- // or time enough for a server frame has gone by
+- NET_Sleep(frameMsec - sv.timeResidual);
+- return;
+- }
+-
+ // if time is about to hit the 32nd bit, kick all clients
+ // and clear sv.time, rather
+ // than checking for negative time wraparound everywhere.
+diff --git a/codemp/sys/sys_unix.cpp b/codemp/sys/sys_unix.cpp
+index b20f2eb..df278c3 100644
+--- a/codemp/sys/sys_unix.cpp
++++ b/codemp/sys/sys_unix.cpp
+@@ -187,13 +187,10 @@ EVENT LOOP
+
+ sysEvent_t eventQue[MAX_QUED_EVENTS];
+ int eventHead, eventTail;
+-byte sys_packetReceived[MAX_MSGLEN];
+
+ sysEvent_t Sys_GetEvent( void ) {
+ sysEvent_t ev;
+ char *s;
+- msg_t netmsg;
+- netadr_t adr;
+
+ // return if we have data
+ if ( eventHead > eventTail ) {
+@@ -213,20 +210,6 @@ sysEvent_t Sys_GetEvent( void ) {
+ Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b );
+ }
+
+- // check for network packets
+- MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) );
+- if ( Sys_GetPacket ( &adr, &netmsg ) ) {
+- netadr_t *buf;
+- int len;
+-
+- // copy out to a seperate buffer for qeueing
+- len = sizeof( netadr_t ) + netmsg.cursize;
+- buf = (netadr_t *)Z_Malloc( len,TAG_EVENT,qfalse );
+- *buf = adr;
+- memcpy( buf+1, netmsg.data, netmsg.cursize );
+- Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf );
+- }
+-
+ // return if we have data
+ if ( eventHead > eventTail ) {
+ eventTail++;
+diff --git a/codemp/win32/win_main.cpp b/codemp/win32/win_main.cpp
+index caef083..7c64108 100644
+--- a/codemp/win32/win_main.cpp
++++ b/codemp/win32/win_main.cpp
+@@ -641,7 +641,6 @@ EVENT LOOP
+
+ sysEvent_t eventQue[MAX_QUED_EVENTS];
+ int eventHead, eventTail;
+-byte sys_packetReceived[MAX_MSGLEN];
+
+ /*
+ ================
+@@ -689,8 +688,6 @@ sysEvent_t Sys_GetEvent( void ) {
+ MSG msg;
+ sysEvent_t ev;
+ char *s;
+- msg_t netmsg;
+- netadr_t adr;
+
+ // return if we have data
+ if ( eventHead > eventTail ) {
+@@ -723,21 +720,6 @@ sysEvent_t Sys_GetEvent( void ) {
+ Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b );
+ }
+
+- // check for network packets
+- MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) );
+- if ( Sys_GetPacket ( &adr, &netmsg ) ) {
+- netadr_t *buf;
+- int len;
+-
+- // copy out to a seperate buffer for qeueing
+- // the readcount stepahead is for SOCKS support
+- len = sizeof( netadr_t ) + netmsg.cursize - netmsg.readcount;
+- buf = (netadr_t *)Z_Malloc( len, TAG_EVENT, qtrue );
+- *buf = adr;
+- memcpy( buf+1, &netmsg.data[netmsg.readcount], netmsg.cursize - netmsg.readcount );
+- Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf );
+- }
+-
+ // return if we have data
+ if ( eventHead > eventTail ) {
+ eventTail++;
+diff --git a/codemp/win32/win_main_ded.cpp b/codemp/win32/win_main_ded.cpp
+index 6304446..bc88d2d 100644
+--- a/codemp/win32/win_main_ded.cpp
++++ b/codemp/win32/win_main_ded.cpp
+@@ -782,7 +782,6 @@ EVENT LOOP
+ sysEvent_t eventQue[MAX_QUED_EVENTS];
+ static int eventHead=0;
+ static int eventTail=0;
+-byte sys_packetReceived[MAX_MSGLEN];
+
+ /*
+ ================
+@@ -864,21 +863,6 @@ sysEvent_t Sys_GetEvent( void ) {
+ Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b );
+ }
+
+- // check for network packets
+- MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) );
+- if ( Sys_GetPacket ( &adr, &netmsg ) ) {
+- netadr_t *buf;
+- int len;
+-
+- // copy out to a seperate buffer for qeueing
+- // the readcount stepahead is for SOCKS support
+- len = sizeof( netadr_t ) + netmsg.cursize - netmsg.readcount;
+- buf = (netadr_t *)Z_Malloc( len, TAG_EVENT, qtrue );
+- *buf = adr;
+- memcpy( buf+1, &netmsg.data[netmsg.readcount], netmsg.cursize - netmsg.readcount );
+- Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf );
+- }
+-
+ // return if we have data
+ if ( eventHead > eventTail ) {
+ eventTail++;
diff --git a/debian/patches/series b/debian/patches/series
index e811ac2..06bc0dc 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,4 @@ g_utils-stub-out-debug-code-to-write-to-a-misc-Windo.patch
Allow-using-an-external-libjpeg-turbo-or-libjpeg8.patch
Use-system-zlib-headers-if-we-re-using-system-zlib.patch
Don-t-link-renderer-and-clients-to-a-bunch-of-unnece.patch
+Use-NET_Sleep-or-Sys_Sleep-for-SP-to-avoid-busy-wait.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/openjk.git
More information about the Pkg-games-commits
mailing list