X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=sys_linux.c;h=6a876d1b029086fce435cb5e0d1c6027c1ff6833;hb=ac5533c5e5a5ad2e2edfae17c596faf29692aa06;hp=f3db25efac8a6dc642ec3f6ffb1b6246a351c4bd;hpb=65fea57d305ccc8d64fa83759d5b32bb69617b95;p=xonotic%2Fdarkplaces.git diff --git a/sys_linux.c b/sys_linux.c index f3db25ef..6a876d1b 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -1,5 +1,7 @@ +#include "quakedef.h" #ifdef WIN32 +#include #include "conio.h" #else #include @@ -9,11 +11,9 @@ #include -#include "quakedef.h" - #ifdef WIN32 -cvar_t sys_usetimegettime = {CVAR_SAVE, "sys_usetimegettime", "1"}; +cvar_t sys_usetimegettime = {CVAR_SAVE, "sys_usetimegettime", "1", "use windows timeGetTime function (which has issues on some motherboards) for timing rather than QueryPerformanceCounter timer (which has issues on multicore/multiprocessor machines and processors which are designed to conserve power)"}; #endif @@ -32,7 +32,7 @@ void Sys_Shutdown (void) void Sys_Error (const char *error, ...) { va_list argptr; - char string[1024]; + char string[MAX_INPUTLINE]; // change stdin to non blocking #ifndef WIN32 @@ -51,7 +51,22 @@ void Sys_Error (const char *error, ...) void Sys_PrintToTerminal(const char *text) { - fprintf(stdout, "%s", text); +#ifndef WIN32 + // BUG: for some reason, NDELAY also affects stdout (1) when used on stdin (0). + int origflags = fcntl (1, F_GETFL, 0); + fcntl (1, F_SETFL, origflags & ~FNDELAY); +#endif + while(*text) + { + int written = (int)write(1, text, (int)strlen(text)); + if(written <= 0) + break; // sorry, I cannot do anything about this error - without an output + text += written; + } +#ifndef WIN32 + fcntl (1, F_SETFL, origflags); +#endif + //fprintf(stdout, "%s", text); } double Sys_DoubleTime (void) @@ -60,6 +75,7 @@ double Sys_DoubleTime (void) static double oldtime = 0.0, curtime = 0.0; double newtime; #ifdef WIN32 +#include // LordHavoc: note to people modifying this code, DWORD is specifically defined as an unsigned 32bit number, therefore the 65536.0 * 65536.0 is fine. if (sys_usetimegettime.integer) { @@ -96,7 +112,12 @@ double Sys_DoubleTime (void) LARGE_INTEGER PerformanceCount; if (!QueryPerformanceFrequency (&PerformanceFreq)) - Sys_Error ("No hardware timer available"); + { + Con_Printf ("No hardware timer available\n"); + // fall back to timeGetTime + Cvar_SetValueQuick(&sys_usetimegettime, true); + return Sys_DoubleTime(); + } QueryPerformanceCounter (&PerformanceCount); #ifdef __BORLANDC__ @@ -136,8 +157,8 @@ char *Sys_ConsoleInput(void) { if (cls.state == ca_dedicated) { - static char text[256]; - static int len = 0; + static char text[MAX_INPUTLINE]; + static unsigned int len = 0; #ifdef WIN32 int c; @@ -192,14 +213,16 @@ char *Sys_ConsoleInput(void) return NULL; } -void Sys_Sleep(int milliseconds) +void Sys_Sleep(int microseconds) { - if (milliseconds < 1) - milliseconds = 1; #ifdef WIN32 - Sleep(milliseconds); + if (microseconds < 1000) + microseconds = 1000; + Sleep(microseconds / 1000); #else - usleep(milliseconds * 1000); + if (microseconds < 1) + microseconds = 1; + usleep(microseconds); #endif } @@ -218,8 +241,6 @@ void Sys_Init_Commands (void) int main (int argc, char **argv) { - double frameoldtime, framenewtime; - signal(SIGFPE, SIG_IGN); com_argc = argc; @@ -229,17 +250,7 @@ int main (int argc, char **argv) fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); #endif - Host_Init(); + Host_Main(); - frameoldtime = Sys_DoubleTime () - 0.1; - while (1) - { - // find time spent rendering last frame - framenewtime = Sys_DoubleTime (); - - Host_Frame (framenewtime - frameoldtime); - - frameoldtime = framenewtime; - } return 0; }