xserver: Branch 'input-hotplug' - 6 commits

Daniel Stone daniels at kemper.freedesktop.org
Thu Oct 26 01:10:16 EEST 2006


 configure.ac                   |   41 ++++++++++++++++++++++++++++++++++++++++-
 hw/xfree86/common/xf86Config.c |    2 +-
 include/dix-config.h.in        |    3 +++
 os/WaitFor.c                   |   34 +++++++++++++++++++++++++++++++---
 os/utils.c                     |   39 +++++++++++++++++++++++++++++++++++----
 randr/randr.c                  |    1 +
 6 files changed, 111 insertions(+), 9 deletions(-)

New commits:
diff-tree cdc8a4b7b2f099b8860a54c5c9f488e6f7c4913a (from parents)
Merge: 3da918a16c8908fdfaf89f2a1bcaec19e01528a9 d285833290316cb5dd1e7f1e52c96be3e9cf21cd
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Oct 26 00:28:30 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index a6eb8cc,0f2ddd5..aa6c607
@@@ -890,32 -873,46 +890,69 @@@
  
  XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS}"
  XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} -lm"
- AC_SUBST([XSERVER_LIBS])
  AC_SUBST([SYS_LIBS])
  
 +# The Xorg binary needs to export symbols so that they can be used from modules
 +# Some platforms require extra flags to do this.   gcc should set these flags
 +# when -rdynamic is passed to it, other compilers/linkers may need to be added
 +# here.
 +if test "x$GCC" = "xyes"; then
 +       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
 +       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
 +       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
 +       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
 +       if test "x$WERROR" = "xyes"; then
 +               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
 +       fi
 +       XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
 +
 +       LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
 +fi
 +case $host_os in
 +       openbsd*)
 +       LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
 +       ;;
 +esac
 +AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
 +
+ AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
+                [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
+                              [have_clock_gettime=no])])
+ 
+ AC_MSG_CHECKING([for a useful monotonic clock ...])
+ 
+ if ! test "x$have_clock_gettime" = xno; then
+     if ! test "x$have_clock_gettime" = xyes; then
+         LIBS="$have_clock_gettime"
+     else
+         LIBS=""
+     fi
+ 
+     AC_RUN_IFELSE([
+ #define _POSIX_C_SOURCE 199309L
+ #include <time.h>
+ 
+ int main(int argc, char *argv[]) {
+     struct timespec tp;
+ 
+     if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+         return 0;
+     else
+         return 1;
+ }
+     ], [MONOTONIC_CLOCK=yes], [MONOTONIC_CLOCK=no],
+        [MONOTONIC_CLOCK="cross compiling"])
+ else
+     MONOTONIC_CLOCK=no
+ fi
+ 
+ AC_MSG_RESULT([$MONOTONIC_CLOCK])
+ 
+ if test "x$MONOTONIC_CLOCK" = xyes; then
+     AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
+     XSERVER_LIBS="$XSERVER_LIBS $LIBS"
+ fi
+ 
  dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
  dnl we need to replicate that here until those can all be fixed
  AC_MSG_CHECKING([if SVR4 needs to be defined])
diff --cc include/dix-config.h.in
index a920242,35700e4..fc1e69a
@@@ -445,16 -445,7 +445,19 @@@
  /* Define to 1 if modules should avoid the libcwrapper */
  #undef NO_LIBCWRAPPER
  
 +/* Support D-BUS */
 +#undef HAVE_DBUS
 +
 +/* Use only built-in fonts */
 +#undef BUILTIN_FONTS
 +
 +/* Avoid using font servers */
 +#undef NOFONTSERVERACCESS
 +
 +/* Use an empty root cursor */
 +#undef NULL_ROOT_CURSOR
 +
+ /* Have a monotonic clock from clock_gettime() */
+ #undef MONOTONIC_CLOCK
+ 
  #endif /* _DIX_CONFIG_H_ */
diff-tree d285833290316cb5dd1e7f1e52c96be3e9cf21cd (from d3e57faffee63df1424a209d0418d3a712f91ae6)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 23:57:00 2006 +0300

    GetTimeInMillis: spuport monotonic clock
    Add support for CLOCK_MONOTONIC from clock_gettime, and use that in
    GetTimeInMillis() if available, falling back to the old gettimeofday()
    implementation.
    
    This is _slightly_ faster on some 64-bit architectures, and _slightly_
    slower on others (though barely measurable).

diff --git a/configure.ac b/configure.ac
index 444b021..0f2ddd5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -515,7 +515,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.l
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
+REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto [xproto >= 7.0.9] xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc"
 
 AM_CONDITIONAL(XV, [test "x$XV" = xyes])
@@ -873,9 +873,46 @@ PKG_CHECK_MODULES([XSERVERLIBS], [$REQUI
 
 XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS}"
 XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} -lm"
-AC_SUBST([XSERVER_LIBS])
 AC_SUBST([SYS_LIBS])
 
+AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
+               [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
+                             [have_clock_gettime=no])])
+
+AC_MSG_CHECKING([for a useful monotonic clock ...])
+
+if ! test "x$have_clock_gettime" = xno; then
+    if ! test "x$have_clock_gettime" = xyes; then
+        LIBS="$have_clock_gettime"
+    else
+        LIBS=""
+    fi
+
+    AC_RUN_IFELSE([
+#define _POSIX_C_SOURCE 199309L
+#include <time.h>
+
+int main(int argc, char *argv[]) {
+    struct timespec tp;
+
+    if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+        return 0;
+    else
+        return 1;
+}
+    ], [MONOTONIC_CLOCK=yes], [MONOTONIC_CLOCK=no],
+       [MONOTONIC_CLOCK="cross compiling"])
+else
+    MONOTONIC_CLOCK=no
+fi
+
+AC_MSG_RESULT([$MONOTONIC_CLOCK])
+
+if test "x$MONOTONIC_CLOCK" = xyes; then
+    AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
+    XSERVER_LIBS="$XSERVER_LIBS $LIBS"
+fi
+
 dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
 dnl we need to replicate that here until those can all be fixed
 AC_MSG_CHECKING([if SVR4 needs to be defined])
@@ -890,6 +927,8 @@ AC_MSG_RESULT([yes])], AC_MSG_RESULT([no
 XSERVER_CFLAGS="$XSERVER_CFLAGS $CORE_INCS $XEXT_INC $COMPOSITE_INC $DAMAGE_INC $FIXES_INC $XI_INC $MI_INC $MIEXT_SHADOW_INC $MIEXT_LAYER_INC $MIEXT_DAMAGE_INC $RENDER_INC $RANDR_INC $FB_INC"
 AC_DEFINE_UNQUOTED(X_BYTE_ORDER,[$ENDIAN],[Endian order])
 
+AC_SUBST([XSERVER_LIBS])
+
 dnl ---------------------------------------------------------------------------
 dnl DDX section.
 dnl ---------------------------------------------------------------------------
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 65c42e6..35700e4 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -445,4 +445,7 @@
 /* Define to 1 if modules should avoid the libcwrapper */
 #undef NO_LIBCWRAPPER
 
+/* Have a monotonic clock from clock_gettime() */
+#undef MONOTONIC_CLOCK
+
 #endif /* _DIX_CONFIG_H_ */
diff --git a/os/utils.c b/os/utils.c
index 31ae26a..379291c 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -53,6 +53,19 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #include <dix-config.h>
 #endif
 
+/* The world's most shocking hack, to ensure we get clock_gettime() and
+ * CLOCK_MONOTONIC. */
+#ifdef _POSIX_C_SOURCE
+#define _SAVED_POSIX_C_SOURCE _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+#define _POSIX_C_SOURCE 199309L
+#include <time.h>
+#undef _POSIX_C_SOURCE
+#ifdef _SAVED_POSIX_C_SOURCE
+#define _POSIX_C_SOURCE _SAVED_POSIX_C_SOURCE
+#endif
+
 #ifdef __CYGWIN__
 #include <stdlib.h>
 #include <signal.h>
@@ -92,7 +105,6 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #if !defined(SYSV) && !defined(WIN32) && !defined(Lynx) && !defined(QNX4)
 #include <sys/resource.h>
 #endif
-#include <time.h>
 #include <sys/stat.h>
 #include <ctype.h>    /* for isspace */
 #include <stdarg.h>
@@ -256,6 +268,8 @@ int auditTrailLevel = 1;
 
 _X_EXPORT Bool Must_have_memory = FALSE;
 
+static int monotonic_usable = -1;
+
 #ifdef AIXV3
 int SyncOn  = 0;
 extern int SelectWaitTime;
@@ -535,10 +549,27 @@ GiveUp(int sig)
 _X_EXPORT CARD32
 GetTimeInMillis(void)
 {
-    struct timeval  tp;
+    struct timeval tv;
+#ifdef MONOTONIC_CLOCK
+    struct timespec tp;
+    int spare = 0;
+
+    if (_X_UNLIKELY(monotonic_usable == -1)) {
+        if (clock_gettime(0, &tp) == 0 &&
+            clock_getcpuclockid(0, &spare) == 0)
+            monotonic_usable = 1;
+        else
+            monotonic_usable = 0;
+    }
+
+    if (_X_LIKELY(monotonic_usable == 1)) {
+        if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+            return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000);
+    }
+#endif
 
-    X_GETTIMEOFDAY(&tp);
-    return(tp.tv_sec * 1000) + (tp.tv_usec / 1000);
+    X_GETTIMEOFDAY(&tv);
+    return(tv.tv_sec * 1000) + (tv.tv_usec / 1000);
 }
 
 _X_EXPORT void
diff-tree d3e57faffee63df1424a209d0418d3a712f91ae6 (from becbda6d519a11c2c211afb8d46f9ea1a2676bc3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 23:55:43 2006 +0300

    WaitForSomething: allow time to rewind
    If time rewinds dramatically, reset all the timers to fix their expiry.

diff --git a/os/WaitFor.c b/os/WaitFor.c
index 0457678..896fdf1 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -119,11 +119,13 @@ mffs(fd_mask mask)
 struct _OsTimerRec {
     OsTimerPtr		next;
     CARD32		expires;
+    CARD32              delta;
     OsTimerCallback	callback;
     pointer		arg;
 };
 
 static void DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev);
+static void CheckAllTimers(CARD32 now);
 static OsTimerPtr timers = NULL;
 
 /*****************
@@ -200,6 +202,11 @@ WaitForSomething(int *pClientsReady)
         {
             now = GetTimeInMillis();
 	    timeout = timers->expires - now;
+            /* time has rewound.  reset the timers. */
+            if (timeout > timers->delta) {
+                CheckAllTimers(now);
+                timeout = timers->expires - now;
+            }
             if (timeout < 0)
                 timeout = 0;
 	    waittime.tv_sec = timeout / MILLI_PER_SECOND;
@@ -426,6 +433,20 @@ ANYSET(FdMask *src)
 }
 #endif
 
+/* If time has rewound, re-run every affected timer.
+ * TimerForce will change timer->next, but it will _generally_ only
+ * promote timers in the list, meaning that we should still be
+ * walking every timer. */
+static void
+CheckAllTimers(CARD32 now)
+{
+    OsTimerPtr timer;
+
+    for (timer = timers; timer; timer = timer->next) {
+        if (timer->expires - now > timer->delta)
+            TimerForce(timer);
+    }
+}
 
 static void
 DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev)
@@ -467,8 +488,13 @@ TimerSet(OsTimerPtr timer, int flags, CA
     }
     if (!millis)
 	return timer;
-    if (!(flags & TimerAbsolute))
+    if (flags & TimerAbsolute) {
+        timer->delta = millis - now;
+    }
+    else {
+        timer->delta = millis;
 	millis += now;
+    }
     timer->expires = millis;
     timer->callback = func;
     timer->arg = arg;
@@ -481,8 +507,10 @@ TimerSet(OsTimerPtr timer, int flags, CA
     }
     for (prev = &timers;
 	 *prev && (int) ((*prev)->expires - millis) <= 0;
-	 prev = &(*prev)->next)
-	;
+	 prev = &(*prev)->next) {
+        if ((*prev)->expires - now > (*prev)->delta)
+            CheckAllTimers(now);
+    }
     timer->next = *prev;
     *prev = timer;
     return timer;
diff-tree becbda6d519a11c2c211afb8d46f9ea1a2676bc3 (from 598ac7a83698327b607084abaebcbd22f8d25fbb)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Wed Oct 25 11:39:27 2006 +0200

    Fix test for Option "IgnoreABI".
    
    This option has plenty of potential for wasting the time of bug triagers
    without pretending it's always on.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 87b8a0b..bff9233 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -895,7 +895,7 @@ configServerFlags(XF86ConfFlagsPtr flags
     xf86GetOptValBool(FlagOptions, FLAG_ALLOW_CLOSEDOWN_GRABS,
 		      &(xf86Info.grabInfo.allowClosedown));
     xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
-    if (&xf86Info.ignoreABI) {
+    if (xf86Info.ignoreABI) {
 	    xf86Msg(X_CONFIG, "Ignoring ABI Version\n");
     }
 
diff-tree 598ac7a83698327b607084abaebcbd22f8d25fbb (from parents)
Merge: 828c34e83ccdf3bcd2844d5af8b0cac4164b04ab 948a97b97e93cee05a23f1f1ae699c5e181bc8ce
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Oct 24 17:23:12 2006 -0700

    Merge branch 'origin'

diff-tree 828c34e83ccdf3bcd2844d5af8b0cac4164b04ab (from cf948b7b04dfeb61a294889027b9a54f6b9b478e)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Oct 24 17:23:02 2006 -0700

    Byte swap RRSelectInput enable flags.

diff --git a/randr/randr.c b/randr/randr.c
index 946aad3..d0bbfe5 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -1187,6 +1187,7 @@ SProcRRSelectInput (ClientPtr client)
 
     swaps(&stuff->length, n);
     swapl(&stuff->window, n);
+    swaps(&stuff->enable, n);
     return ProcRRSelectInput(client);
 }
 



More information about the xorg-commit mailing list