From 5e88acf21727deabb4323110f209752f119e2d3f Mon Sep 17 00:00:00 2001 From: Thilo Schulz Date: Fri, 18 Aug 2006 01:50:51 +0000 Subject: [PATCH] Fix 100% CPU usage on idle dedicated servers. --- code/qcommon/common.c | 4 ++-- code/server/sv_main.c | 10 +++++++++- code/unix/unix_net.c | 33 +++++++++++++++++++++++++++------ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/code/qcommon/common.c b/code/qcommon/common.c index d1d40a92..e861b516 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -2660,9 +2660,9 @@ int Com_ModifyMsec( int msec ) { // dedicated servers don't want to clamp for a much longer // period, because it would mess up all the client's views // of time. - if ( msec > 500 ) { + if (com_sv_running->integer && msec > 500) Com_Printf( "Hitch warning: %i msec frame time\n", msec ); - } + clampTime = 5000; } else if ( !com_sv_running->integer ) { diff --git a/code/server/sv_main.c b/code/server/sv_main.c index c2ae7102..152ecbdb 100644 --- a/code/server/sv_main.c +++ b/code/server/sv_main.c @@ -777,7 +777,15 @@ void SV_Frame( int msec ) { return; } - if ( !com_sv_running->integer ) { + if (!com_sv_running->integer) + { + if(com_dedicated->integer) + { + // Block indefinitely until something interesting happens + // on STDIN. + NET_Sleep(-1); + } + return; } diff --git a/code/unix/unix_net.c b/code/unix/unix_net.c index 73c0fd65..12908eba 100644 --- a/code/unix/unix_net.c +++ b/code/unix/unix_net.c @@ -648,19 +648,40 @@ char *NET_ErrorString (void) // sleeps msec or until net socket is ready void NET_Sleep(int msec) { - struct timeval timeout; + struct timeval timeout; fd_set fdset; extern qboolean stdin_active; + qboolean not_empty = qfalse; - if (!ip_socket || !com_dedicated->integer) + if (!com_dedicated->integer) return; // we're not a server, just run full speed FD_ZERO(&fdset); if (stdin_active) + { FD_SET(0, &fdset); // stdin is processed too - FD_SET(ip_socket, &fdset); // network socket - timeout.tv_sec = msec/1000; - timeout.tv_usec = (msec%1000)*1000; - select(ip_socket+1, &fdset, NULL, NULL, &timeout); + not_empty = qtrue; + } + if(ip_socket && com_sv_running->integer) + { + FD_SET(ip_socket, &fdset); // network socket + not_empty = qtrue; + } + + // There's no reason to call select() with an empty set. + if(not_empty) + { + if(msec >= 0) + { + timeout.tv_sec = msec/1000; + timeout.tv_usec = (msec%1000)*1000; + select(ip_socket+1, &fdset, NULL, NULL, &timeout); + } + else + { + // Block indefinitely + select(ip_socket+1, &fdset, NULL, NULL, NULL); + } + } }