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