|
@@ -192,14 +192,21 @@ tor_cond_init(tor_cond_t *cond)
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
-#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) \
|
|
|
|
- && defined(HAVE_PTHREAD_CONDATTR_SETCLOCK)
|
|
|
|
|
|
+#if defined(HAVE_CLOCK_GETTIME)
|
|
|
|
+#if defined(CLOCK_MONOTONIC) && defined(HAVE_PTHREAD_CONDATTR_SETCLOCK)
|
|
/* Use monotonic time so when we timedwait() on it, any clock adjustment
|
|
/* Use monotonic time so when we timedwait() on it, any clock adjustment
|
|
* won't affect the timeout value. */
|
|
* won't affect the timeout value. */
|
|
if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC)) {
|
|
if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC)) {
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
+#define USE_COND_CLOCK CLOCK_MONOTONIC
|
|
|
|
+#else /* !defined HAVE_PTHREAD_CONDATTR_SETCLOCK */
|
|
|
|
+ /* On OSX Sierra, there is no pthread_condattr_setclock, so we are stuck
|
|
|
|
+ * with the realtime clock.
|
|
|
|
+ */
|
|
|
|
+#define USE_COND_CLOCK CLOCK_REALTIME
|
|
|
|
+#endif /* which clock to use */
|
|
|
|
+#endif /* HAVE_CLOCK_GETTIME */
|
|
if (pthread_cond_init(&cond->cond, &condattr)) {
|
|
if (pthread_cond_init(&cond->cond, &condattr)) {
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -242,8 +249,8 @@ tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex, const struct timeval *tv)
|
|
struct timeval tvnow, tvsum;
|
|
struct timeval tvnow, tvsum;
|
|
struct timespec ts;
|
|
struct timespec ts;
|
|
while (1) {
|
|
while (1) {
|
|
-#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
|
|
|
- if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) {
|
|
|
|
|
|
+#if defined(HAVE_CLOCK_GETTIME) && defined(USE_COND_CLOCK)
|
|
|
|
+ if (clock_gettime(USE_COND_CLOCK, &ts) < 0) {
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
tvnow.tv_sec = ts.tv_sec;
|
|
tvnow.tv_sec = ts.tv_sec;
|