Some systems might not want to link against rt and pthread libraries simply to implement monotonic clock, inside GetTimeInMillis(). For those, use a direct syscall instead.
This patch keeps the new syscall version disabled by default - therefore not changing the original behaviour of the xserver build. The main concern was regarding some eventual performance degradation when not going through optimized code in C library, or because syscall is varargs based. The simple program bellow (kudos to Adam Jackson) performs equally in the practice, for both syscall and C library implementation, when executed in several architectures: int main(void) { int i; struct timespec tp; for (i = 0; i < 1e7; i++) clock_gettime(CLOCK_MONOTONIC, &tp); return 0; } Signed-off-by: Tiago Vignatti <tiago.vigna...@nokia.com> --- Myself, ajax, alanc and others discussed already on IRC about the performance degradation. We all ran the program above, obtaining equally results within different environments. Besides, I think I could use AC_CHECK_FUNC(syscall) to check in fact if the call exists, but I thought that would be too much. Or not? I guess also one will like to work out a bit the autoconf code. It's gigantic and confusing! But lets work on it in another patch instead :) configure.ac | 10 +++++++++- include/dix-config.h.in | 3 +++ os/utils.c | 5 +++++ 3 files changed, 17 insertions(+), 1 deletions(-) diff --git a/configure.ac b/configure.ac index a6b058d..8f42c60 100644 --- a/configure.ac +++ b/configure.ac @@ -632,6 +632,9 @@ AC_ARG_ENABLE(xaa, AS_HELP_STRING([--enable-xaa], [Build XAA (defa AC_ARG_ENABLE(vgahw, AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes]) AC_ARG_ENABLE(vbe, AS_HELP_STRING([--enable-vbe], [Build Xorg with VBE module (default: enabled)]), [VBE=$enableval], [VBE=yes]) AC_ARG_ENABLE(int10-module, AS_HELP_STRING([--enable-int10-module], [Build Xorg with int10 module (default: enabled)]), [INT10MODULE=$enableval], [INT10MODULE=yes]) +dnl clock_gettime() uses rt library and some systems might not want to link +dnl against it, so the alternative is to use syscall directly. +AC_ARG_ENABLE(syscall-clock, AS_HELP_STRING([--enable-syscall-clock], [Use syscall to build monotonic clock instead C library based version (default: disabled)]), [SYSCALL_CLOCK=$enableval], [SYSCALL_CLOCK=no]) dnl DDXes. AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto]) @@ -912,7 +915,12 @@ AC_MSG_RESULT([$MONOTONIC_CLOCK]) if test "x$MONOTONIC_CLOCK" = xyes; then AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()]) - LIBS="$LIBS $CLOCK_LIBS" + if test "x$SYSCALL_CLOCK" = xyes; then + AC_DEFINE(SYSCALL_MONOTONIC_CLOCK, 1, + [Use syscall based monotonic clock]) + else + LIBS="$LIBS $CLOCK_LIBS" + fi fi AM_CONDITIONAL(XV, [test "x$XV" = xyes]) diff --git a/include/dix-config.h.in b/include/dix-config.h.in index 32e88d9..1fd6310 100644 --- a/include/dix-config.h.in +++ b/include/dix-config.h.in @@ -402,6 +402,9 @@ /* Have a monotonic clock from clock_gettime() */ #undef MONOTONIC_CLOCK +/* Have a monotonic clock from a direct syscall */ +#undef SYSCALL_MONOTONIC_CLOCK + /* Define to 1 if the DTrace Xserver provider probes should be built in */ #undef XSERVER_DTRACE diff --git a/os/utils.c b/os/utils.c index 5a5a203..a13ba3f 100644 --- a/os/utils.c +++ b/os/utils.c @@ -124,6 +124,11 @@ __stdcall unsigned long GetTickCount(void); #include "picture.h" #endif +#ifdef SYSCALL_MONOTONIC_CLOCK +#include <sys/syscall.h> +#define clock_gettime(a, b) syscall(SYS_clock_gettime, a, b) +#endif + Bool noTestExtensions; #ifdef COMPOSITE Bool noCompositeExtension = FALSE; -- 1.6.0.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel