summaryrefslogtreecommitdiffstats
path: root/configure.in
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2009-07-10 22:27:55 -0400
committerColin Walters <walters@verbum.org>2009-07-10 22:57:08 -0400
commitae24bb35e2ee3ecde990f55852982b573754ec43 (patch)
treebc812e591077f8abdbd23b329c4719bed6ab3a8c /configure.in
parentf4e15893e5be6da6c7642bb7ef9b14d5531afe41 (diff)
Bug 18121 - Use a monotonic clock for pthread timeouts
Patch based on one from Keith Mok <ek9852@gmail.com>, some followup work from Janne Karhunen <Janne.Karhunen@gmail.com>. We don't want condition variable timeouts to be affected by the system clock. Use the POSIX CLOCK_MONOTONIC if available.
Diffstat (limited to 'configure.in')
-rw-r--r--configure.in25
1 files changed, 24 insertions, 1 deletions
diff --git a/configure.in b/configure.in
index 3af9cf7c..bd21a8c3 100644
--- a/configure.in
+++ b/configure.in
@@ -696,8 +696,31 @@ if $dbus_use_libxml; then
fi
# Thread lib detection
-AC_CHECK_FUNC(pthread_cond_timedwait,,[AC_CHECK_LIB(pthread,pthread_cond_timedwait,
+AC_CHECK_FUNC(pthread_cond_timedwait,[AC_CHECK_LIB(pthread,pthread_cond_timedwait,
[THREAD_LIBS="-lpthread"])])
+save_libs="$LIBS"
+LIBS="$LIBS $THREAD_LIBS"
+AC_CHECK_FUNC(pthread_condattr_setclock,have_pthread_condattr_setclock=true,have_pthread_condattr_setclock=false)
+if test x$have_pthread_condattr_setclock = xtrue; then
+ AC_SEARCH_LIBS([clock_getres],[rt],[THREAD_LIBS="$THREAD_LIBS -lrt"])
+ AC_MSG_CHECKING([for CLOCK_MONOTONIC])
+ AC_TRY_COMPILE([#include <time.h>
+#include <pthread.h>
+], [
+struct timespec monotonic_timer;
+pthread_condattr_t attr;
+pthread_condattr_init (&attr);
+pthread_condattr_setclock (&attr, CLOCK_MONOTONIC);
+clock_getres (CLOCK_MONOTONIC,&monotonic_timer);
+], have_clock_monotonic=true, have_clock_monotonic=false)
+if test x$have_clock_monotonic = xtrue; then
+ AC_MSG_RESULT([found])
+ AC_DEFINE(HAVE_MONOTONIC_CLOCK, 1, [Define if we have CLOCK_MONOTONIC])
+else
+ AC_MSG_RESULT([not found])
+fi
+fi
+LIBS="$save_libs"
# SELinux detection
if test x$enable_selinux = xno ; then