diff -r f2cb733c9a37 -r e96f8383adfd Python/ceval_gil.h --- a/Python/ceval_gil.h Tue Aug 23 00:58:21 2011 +0200 +++ b/Python/ceval_gil.h Tue Aug 23 16:11:07 2011 +0900 @@ -77,13 +77,6 @@ #include -#define ADD_MICROSECONDS(tv, interval) \ -do { \ - tv.tv_usec += (long) interval; \ - tv.tv_sec += tv.tv_usec / 1000000; \ - tv.tv_usec %= 1000000; \ -} while (0) - /* We assume all modern POSIX systems have gettimeofday() */ #ifdef GETTIMEOFDAY_NO_TZ #define GETTIMEOFDAY(ptv) gettimeofday(ptv) @@ -106,9 +99,7 @@ Py_FatalError("pthread_mutex_unlock(" #mut ") failed"); }; #define COND_T pthread_cond_t -#define COND_INIT(cond) \ - if (pthread_cond_init(&cond, NULL)) { \ - Py_FatalError("pthread_cond_init(" #cond ") failed"); }; + #define COND_FINI(cond) \ if (pthread_cond_destroy(&cond)) { \ Py_FatalError("pthread_cond_destroy(" #cond ") failed"); }; @@ -118,6 +109,55 @@ #define COND_WAIT(cond, mut) \ if (pthread_cond_wait(&cond, &mut)) { \ Py_FatalError("pthread_cond_wait(" #cond ") failed"); }; + +#if HAVE_PTHREAD_CONDATTR_SETCLOCK + +#include +#define ADD_MICROSECONDS(ts, interval) \ +do { \ + ts.tv_nsec += (long) interval * 1000; \ + ts.tv_sec += ts.tv_nsec / 1000000000; \ + ts.tv_nsec %= 1000000000; \ +} while (0) + + +#define COND_INIT(cond) {\ + pthread_condattr_t condattr;\ + pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);\ + if (pthread_cond_init(&cond, &condattr)) { \ + Py_FatalError("pthread_cond_init(" #cond ") failed"); \ + }} + +#define COND_TIMED_WAIT(cond, mut, microseconds, timeout_result) \ + { \ + int r; \ + struct timespec ts; \ + \ + clock_gettime(CLOCK_MONOTONIC, &ts); \ + ADD_MICROSECONDS(ts, microseconds); \ + r = pthread_cond_timedwait(&cond, &mut, &ts); \ + if (r == ETIMEDOUT) \ + timeout_result = 1; \ + else if (r) \ + Py_FatalError("pthread_cond_timedwait(" #cond ") failed"); \ + else \ + timeout_result = 0; \ + } \ + + +#else + +#define ADD_MICROSECONDS(tv, interval) \ +do { \ + tv.tv_usec += (long) interval; \ + tv.tv_sec += tv.tv_usec / 1000000; \ + tv.tv_usec %= 1000000; \ +} while (0) + +#define COND_INIT(cond) \ + if (pthread_cond_init(&cond, NULL)) { \ + Py_FatalError("pthread_cond_init(" #cond ") failed"); }; + #define COND_TIMED_WAIT(cond, mut, microseconds, timeout_result) \ { \ int r; \ @@ -138,6 +178,8 @@ timeout_result = 0; \ } \ +#endif /* HAVE_PTHREAD_CONDATTR_SETCLOCK */ + #elif defined(NT_THREADS) /* diff -r f2cb733c9a37 -r e96f8383adfd configure --- a/configure Tue Aug 23 00:58:21 2011 +0200 +++ b/configure Tue Aug 23 16:11:07 2011 +0900 @@ -9345,7 +9345,7 @@ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ - wcscoll wcsftime wcsxfrm writev _getpty + wcscoll wcsftime wcsxfrm writev _getpty pthread_condattr_setclock do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff -r f2cb733c9a37 -r e96f8383adfd pyconfig.h.in --- a/pyconfig.h.in Tue Aug 23 00:58:21 2011 +0200 +++ b/pyconfig.h.in Tue Aug 23 16:11:07 2011 +0900 @@ -1058,6 +1058,9 @@ /* Define to 1 if you have the `_getpty' function. */ #undef HAVE__GETPTY +/* Define to 1 if you have the `pthread_condattr_setclock`. */ +#undef HAVE_PTHREAD_CONDATTR_SETCLOCK + /* Define if log1p(-0.) is 0. rather than -0. */ #undef LOG1P_DROPS_ZERO_SIGN