From: Sebastian Dröge Date: Thu, 4 Jul 2013 08:27:02 +0000 (+0200) Subject: gthread: Use pthread_cond_timedwait_monotonic() if available X-Git-Tag: 2.37.4~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dbdfcb69ce4a7f14bac784c2684c1a66bfe6a2c9;p=platform%2Fupstream%2Fglib.git gthread: Use pthread_cond_timedwait_monotonic() if available Otherwise we have to rely on pthread_cond_timedwait() actually using the monotonic clock, which might be true or not. On Android at least it is using the realtime clock, no pthread_condattr_setclock() is available but instead pthread_cond_timedwait_monotonic() can be used. --- diff --git a/configure.ac b/configure.ac index 1fba2da..9bfc3d8 100644 --- a/configure.ac +++ b/configure.ac @@ -2383,6 +2383,24 @@ AS_IF([ test x"$have_threads" = xposix], [ AC_DEFINE(HAVE_PTHREAD_CONDATTR_SETCLOCK,1, [Have function pthread_condattr_setclock])], [AC_MSG_RESULT(no)]) + AC_MSG_CHECKING(for pthread_cond_timedwait_monotonic) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#include ], + [pthread_cond_timedwait_monotonic(NULL, NULL, NULL)])], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC,1, + [Have function pthread_cond_timedwait_monotonic])], + [AC_MSG_RESULT(no)]) + AC_MSG_CHECKING(for pthread_cond_timedwait_monotonic_np) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#include ], + [pthread_cond_timedwait_monotonic_np(NULL, NULL, NULL)])], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP,1, + [Have function pthread_cond_timedwait_monotonic_np])], + [AC_MSG_RESULT(no)]) CPPFLAGS="$glib_save_CPPFLAGS" ]) diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c index 23371ae..c7b68a0 100644 --- a/glib/gthread-posix.c +++ b/glib/gthread-posix.c @@ -859,8 +859,17 @@ g_cond_wait_until (GCond *cond, ts.tv_sec = end_time / 1000000; ts.tv_nsec = (end_time % 1000000) * 1000; +#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC) + if ((status = pthread_cond_timedwait_monotonic (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0) + return TRUE; +#elif defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP) + if ((status = pthread_cond_timedwait_monotonic_np (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0) + return TRUE; +#else + /* Pray that the cond is actually using the monotonic clock */ if ((status = pthread_cond_timedwait (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0) return TRUE; +#endif if G_UNLIKELY (status != ETIMEDOUT) g_thread_abort (status, "pthread_cond_timedwait");