* (bug #4346) Dedicated server uses 100% CPU when stdin is not a TTY

* com_speeds reports misleading values on dedicated server (Guillaume Bougard)
This commit is contained in:
Tim Angus 2009-12-24 00:40:39 +00:00
parent fa2a698aa3
commit 78df7a1de4
3 changed files with 38 additions and 15 deletions

View file

@ -3065,6 +3065,12 @@ void Com_Frame( void ) {
if ( com_speeds->integer ) {
timeAfter = Sys_Milliseconds ();
}
#else
if ( com_speeds->integer ) {
timeAfter = Sys_Milliseconds ();
timeBeforeEvents = timeAfter;
timeBeforeClient = timeAfter;
}
#endif
//

View file

@ -40,6 +40,7 @@ called before and after a stdout or stderr output
=============================================================
*/
extern qboolean stdinIsATTY;
static qboolean stdin_active;
// general flag to tell about tty console mode
static qboolean ttycon_on = qfalse;
@ -268,21 +269,19 @@ Initialize the console input (tty mode if possible)
void CON_Init( void )
{
struct termios tc;
const char* term = getenv("TERM");
// If the process is backgrounded (running non interactively)
// then SIGTTIN or SIGTOU is emitted, if not caught, turns into a SIGSTP
signal(SIGTTIN, SIG_IGN);
signal(SIGTTOU, SIG_IGN);
// If SIGCONT is received, reinitialize console
signal(SIGCONT, CON_SigCont);
// Make stdin reads non-blocking
fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK );
if (isatty(STDIN_FILENO) != 1
|| (term && (!strcmp(term, "raw") || !strcmp(term, "dumb"))))
if (!stdinIsATTY)
{
Com_Printf("tty console mode disabled\n");
ttycon_on = qfalse;

View file

@ -37,6 +37,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <libgen.h>
#include <fcntl.h>
qboolean stdinIsATTY;
// Used to determine where to store user-specific files
static char homePath[ MAX_OSPATH ] = { 0 };
@ -354,7 +356,7 @@ char **Sys_ListFiles( const char *directory, const char *extension, char *filter
}
extLen = strlen( extension );
// search
nfiles = 0;
@ -464,24 +466,35 @@ Block execution for msec or until input is recieved.
*/
void Sys_Sleep( int msec )
{
fd_set fdset;
if( msec == 0 )
return;
FD_ZERO(&fdset);
FD_SET(fileno(stdin), &fdset);
if( msec < 0 )
if( stdinIsATTY )
{
select((fileno(stdin) + 1), &fdset, NULL, NULL, NULL);
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(STDIN_FILENO, &fdset);
if( msec < 0 )
{
select(STDIN_FILENO + 1, &fdset, NULL, NULL, NULL);
}
else
{
struct timeval timeout;
timeout.tv_sec = msec/1000;
timeout.tv_usec = (msec%1000)*1000;
select(STDIN_FILENO + 1, &fdset, NULL, NULL, &timeout);
}
}
else
{
struct timeval timeout;
// With nothing to select() on, we can't wait indefinitely
if( msec < 0 )
msec = 10;
timeout.tv_sec = msec/1000;
timeout.tv_usec = (msec%1000)*1000;
select((fileno(stdin) + 1), &fdset, NULL, NULL, &timeout);
usleep( msec * 1000 );
}
}
@ -571,11 +584,16 @@ Unix specific initialisation
*/
void Sys_PlatformInit( void )
{
const char* term = getenv( "TERM" );
signal( SIGHUP, Sys_SigHandler );
signal( SIGQUIT, Sys_SigHandler );
signal( SIGTRAP, Sys_SigHandler );
signal( SIGIOT, Sys_SigHandler );
signal( SIGBUS, Sys_SigHandler );
stdinIsATTY = isatty( STDIN_FILENO ) &&
!( term && ( !strcmp( term, "raw" ) || !strcmp( term, "dumb" ) ) );
}
/*