diff options
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | hw/xwayland/xwayland.c | 2 | ||||
-rw-r--r-- | include/os.h | 7 | ||||
-rw-r--r-- | os/utils.c | 24 |
4 files changed, 35 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index 6c96de2c3..0d3ad5a03 100644 --- a/configure.ac +++ b/configure.ac @@ -2492,6 +2492,10 @@ if test "x$XWAYLAND" = xyes; then AC_SUBST([XWAYLAND_LIBS]) AC_SUBST([XWAYLAND_SYS_LIBS]) + if test "x$MONOTONIC_CLOCK" != xyes; then + AC_MSG_ERROR([Xwayland requires CLOCK_MONOTONIC support.]) + fi + WAYLAND_PREFIX=`$PKG_CONFIG --variable=prefix wayland-client` AC_PATH_PROG([WAYLAND_SCANNER], [wayland-scanner],, [${WAYLAND_PREFIX}/bin$PATH_SEPARATOR$PATH]) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c index 151e0445d..b803ba1ba 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c @@ -32,6 +32,7 @@ #include <misyncshm.h> #include <compositeext.h> #include <glx_extinit.h> +#include <os.h> #ifdef XF86VIDMODE #include <X11/extensions/xf86vmproto.h> @@ -52,6 +53,7 @@ AbortDDX(enum ExitCode error) void OsVendorInit(void) { + ForceClockId(CLOCK_MONOTONIC); } void diff --git a/include/os.h b/include/os.h index 20224f127..702134b52 100644 --- a/include/os.h +++ b/include/os.h @@ -51,6 +51,9 @@ SOFTWARE. #include <stdarg.h> #include <stdint.h> #include <string.h> +#ifdef MONOTONIC_CLOCK +#include <time.h> +#endif #define SCREEN_SAVER_ON 0 #define SCREEN_SAVER_OFF 1 @@ -180,6 +183,10 @@ extern _X_EXPORT void ListenOnOpenFD(int /* fd */ , int /* noxauth */ ); extern _X_EXPORT Bool AddClientOnOpenFD(int /* fd */ ); +#ifdef MONOTONIC_CLOCK +extern void ForceClockId(clockid_t /* forced_clockid */); +#endif + extern _X_EXPORT CARD32 GetTimeInMillis(void); extern _X_EXPORT CARD64 GetTimeInMicros(void); diff --git a/os/utils.c b/os/utils.c index b5c5c5d28..086fe4fcd 100644 --- a/os/utils.c +++ b/os/utils.c @@ -210,6 +210,10 @@ sig_atomic_t inSignalContext = FALSE; #define HAS_SAVED_IDS_AND_SETEUID #endif +#ifdef MONOTONIC_CLOCK +static clockid_t clockid; +#endif + OsSigHandlerPtr OsSignal(int sig, OsSigHandlerPtr handler) { @@ -427,6 +431,24 @@ GiveUp(int sig) errno = olderrno; } +#ifdef MONOTONIC_CLOCK +void +ForceClockId(clockid_t forced_clockid) +{ + struct timespec tp; + + BUG_RETURN (clockid); + + clockid = forced_clockid; + + if (clock_gettime(clockid, &tp) != 0) { + FatalError("Forced clock id failed to retrieve current time: %s\n", + strerror(errno)); + return; + } +} +#endif + #if (defined WIN32 && defined __MINGW32__) || defined(__CYGWIN__) CARD32 GetTimeInMillis(void) @@ -446,7 +468,6 @@ GetTimeInMillis(void) #ifdef MONOTONIC_CLOCK struct timespec tp; - static clockid_t clockid; if (!clockid) { #ifdef CLOCK_MONOTONIC_COARSE @@ -475,7 +496,6 @@ GetTimeInMicros(void) struct timeval tv; #ifdef MONOTONIC_CLOCK struct timespec tp; - static clockid_t clockid; if (!clockid) { if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) |