Fix 100% CPU usage on idle dedicated servers.

This commit is contained in:
Thilo Schulz 2006-08-18 01:50:51 +00:00
parent 55bddd58fd
commit 5e88acf217
3 changed files with 38 additions and 9 deletions

View file

@ -2660,9 +2660,9 @@ int Com_ModifyMsec( int msec ) {
// dedicated servers don't want to clamp for a much longer // dedicated servers don't want to clamp for a much longer
// period, because it would mess up all the client's views // period, because it would mess up all the client's views
// of time. // of time.
if ( msec > 500 ) { if (com_sv_running->integer && msec > 500)
Com_Printf( "Hitch warning: %i msec frame time\n", msec ); Com_Printf( "Hitch warning: %i msec frame time\n", msec );
}
clampTime = 5000; clampTime = 5000;
} else } else
if ( !com_sv_running->integer ) { if ( !com_sv_running->integer ) {

View file

@ -777,7 +777,15 @@ void SV_Frame( int msec ) {
return; 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; return;
} }

View file

@ -648,19 +648,40 @@ char *NET_ErrorString (void)
// sleeps msec or until net socket is ready // sleeps msec or until net socket is ready
void NET_Sleep(int msec) void NET_Sleep(int msec)
{ {
struct timeval timeout; struct timeval timeout;
fd_set fdset; fd_set fdset;
extern qboolean stdin_active; 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 return; // we're not a server, just run full speed
FD_ZERO(&fdset); FD_ZERO(&fdset);
if (stdin_active) if (stdin_active)
{
FD_SET(0, &fdset); // stdin is processed too FD_SET(0, &fdset); // stdin is processed too
FD_SET(ip_socket, &fdset); // network socket not_empty = qtrue;
timeout.tv_sec = msec/1000; }
timeout.tv_usec = (msec%1000)*1000; if(ip_socket && com_sv_running->integer)
select(ip_socket+1, &fdset, NULL, NULL, &timeout); {
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);
}
}
} }