r850 - in trunk/code: qcommon server unix
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Aug 17 21:50:51 EDT 2006
Author: thilo
Date: 2006-08-17 21:50:51 -0400 (Thu, 17 Aug 2006)
New Revision: 850
Modified:
trunk/code/qcommon/common.c
trunk/code/server/sv_main.c
trunk/code/unix/unix_net.c
Log:
Fix 100% CPU usage on idle dedicated servers.
Modified: trunk/code/qcommon/common.c
===================================================================
--- trunk/code/qcommon/common.c 2006-08-16 07:03:20 UTC (rev 849)
+++ trunk/code/qcommon/common.c 2006-08-18 01:50:51 UTC (rev 850)
@@ -2660,9 +2660,9 @@
// 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 ) {
Modified: trunk/code/server/sv_main.c
===================================================================
--- trunk/code/server/sv_main.c 2006-08-16 07:03:20 UTC (rev 849)
+++ trunk/code/server/sv_main.c 2006-08-18 01:50:51 UTC (rev 850)
@@ -777,7 +777,15 @@
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;
}
Modified: trunk/code/unix/unix_net.c
===================================================================
--- trunk/code/unix/unix_net.c 2006-08-16 07:03:20 UTC (rev 849)
+++ trunk/code/unix/unix_net.c 2006-08-18 01:50:51 UTC (rev 850)
@@ -648,19 +648,40 @@
// 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);
+ }
+ }
}
More information about the quake3-commits
mailing list