[PATCH] configure: introduce --{enable, disable}-syscall-clock

Tiago Vignatti tiago.vignatti at nokia.com
Mon Mar 29 10:17:11 PDT 2010

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.vignatti at 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()])
+    if test "x$SYSCALL_CLOCK" = xyes; then
+                    [Use syscall based monotonic clock])
+    else
+    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() */
+/* Have a monotonic clock from a direct syscall */
 /* Define to 1 if the DTrace Xserver provider probes should be built in */
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"
+#include <sys/syscall.h>
+#define clock_gettime(a, b) syscall(SYS_clock_gettime, a, b)
 Bool noTestExtensions;
 Bool noCompositeExtension = FALSE;

More information about the xorg-devel mailing list