From 892af9237609d72a8c9f4e563b52bf844ea3bf15 Mon Sep 17 00:00:00 2001 From: divverent Date: Sun, 15 Jun 2008 14:31:11 +0000 Subject: [PATCH] new cvar sys_useclockgettime (default 0) that makes DP use clock_gettime as time source (should fix bad timing on Solaris, and some Xen oddity). Only supported in the Solaris, Linux and BSD target. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8354 d7cf8633-e32d-0410-b094-e92efae38249 --- makefile.inc | 14 +++++++------- sys_linux.c | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/makefile.inc b/makefile.inc index ab8a448f..6f3bb46d 100644 --- a/makefile.inc +++ b/makefile.inc @@ -205,9 +205,9 @@ OBJ_LINUXCD=cd_linux.o #OBJ_LINUXCD=$(OBJ_NOCD) # Link -LDFLAGS_LINUXCL=$(LDFLAGS_UNIXCOMMON) -ldl $(LDFLAGS_UNIXCL) -LDFLAGS_LINUXSV=$(LDFLAGS_UNIXCOMMON) -ldl -LDFLAGS_LINUXSDL=$(LDFLAGS_UNIXCOMMON) -ldl $(LDFLAGS_UNIXSDL) +LDFLAGS_LINUXCL=$(LDFLAGS_UNIXCOMMON) -lrt -ldl $(LDFLAGS_UNIXCL) +LDFLAGS_LINUXSV=$(LDFLAGS_UNIXCOMMON) -lrt -ldl +LDFLAGS_LINUXSDL=$(LDFLAGS_UNIXCOMMON) -lrt -ldl $(LDFLAGS_UNIXSDL) ##### Mac OS X specific variables ##### @@ -234,9 +234,9 @@ OBJ_SUNOSCD=$(OBJ_NOCD) CFLAGS_SUNOS=-I/usr/lib/oss/include -DBSD_COMP -DSUNOS # Link -LDFLAGS_SUNOSCL=$(LDFLAGS_UNIXCOMMON) -ldl -lsocket -lnsl -R$(UNIX_X11LIBPATH) -L$(UNIX_X11LIBPATH) -lX11 -lXpm -lXext -lXxf86vm $(LIB_SOUND) -LDFLAGS_SUNOSSV=$(LDFLAGS_UNIXCOMMON) -ldl -lsocket -lnsl -LDFLAGS_SUNOSSDL=$(LDFLAGS_UNIXCOMMON) -ldl -lsocket -lnsl $(LDFLAGS_UNIXSDL) +LDFLAGS_SUNOSCL=$(LDFLAGS_UNIXCOMMON) -lrt -ldl -lsocket -lnsl -R$(UNIX_X11LIBPATH) -L$(UNIX_X11LIBPATH) -lX11 -lXpm -lXext -lXxf86vm $(LIB_SOUND) +LDFLAGS_SUNOSSV=$(LDFLAGS_UNIXCOMMON) -lrt -ldl -lsocket -lnsl +LDFLAGS_SUNOSSDL=$(LDFLAGS_UNIXCOMMON) -lrt -ldl -lsocket -lnsl $(LDFLAGS_UNIXSDL) ##### BSD specific variables ##### @@ -248,7 +248,7 @@ OBJ_BSDCD=cd_bsd.o # Link LDFLAGS_BSDCL=$(LDFLAGS_UNIXCOMMON) -lutil $(LDFLAGS_UNIXCL) -LDFLAGS_BSDSV=$(LDFLAGS_UNIXCOMMON) +LDFLAGS_BSDSV=$(LDFLAGS_UNIXCOMMON) LDFLAGS_BSDSDL=$(LDFLAGS_UNIXCOMMON) $(LDFLAGS_UNIXSDL) diff --git a/sys_linux.c b/sys_linux.c index 7439c27f..0ddf3224 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -7,6 +7,7 @@ #include #include #include +#include #endif #include @@ -14,6 +15,10 @@ #ifdef WIN32 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)"}; +#else +# ifndef MACOSX +cvar_t sys_useclockgettime = {CVAR_SAVE, "sys_useclockgettime", "0", "use POSIX clock_gettime function (which has issues if the system clock speed is far off, as it can't get fixed by NTP) for timing rather than gettimeofday (which has issues if the system time is stepped by ntpdate, or apparently on some Xen installations)"}; +# endif #endif @@ -129,9 +134,24 @@ double Sys_DoubleTime (void) #endif } #else - struct timeval tp; - gettimeofday(&tp, NULL); - newtime = (double) tp.tv_sec + tp.tv_usec / 1000000.0; +# ifndef MACOSX + if (sys_useclockgettime.integer) + { + struct timespec ts; +# ifdef SUNOS + clock_gettime(CLOCK_HIGHRES, &ts); +# else + clock_gettime(CLOCK_MONOTONIC, &ts); +# endif + newtime = (double) ts.tv_sec + ts.tv_nsec / 1000000000.0; + } + else +# endif + { + struct timeval tp; + gettimeofday(&tp, NULL); + newtime = (double) tp.tv_sec + tp.tv_usec / 1000000.0; + } #endif if (first) @@ -233,6 +253,13 @@ void Sys_InitConsole (void) void Sys_Init_Commands (void) { +#ifdef WIN32 + Cvar_RegisterVariable(&sys_usetimegettime); +#else +# ifndef MACOSX + Cvar_RegisterVariable(&sys_useclockgettime); +# endif +#endif } int main (int argc, char **argv) -- 2.39.2