mutex: more clock fixes
[fio.git] / mutex.c
diff --git a/mutex.c b/mutex.c
index cc4e353d1f508e492eae65d052c4af65b9f08d5d..ff6ec73062efb4bed4c4a880c0276a263a9a722d 100644 (file)
--- a/mutex.c
+++ b/mutex.c
@@ -8,6 +8,7 @@
 #include <pthread.h>
 #include <sys/mman.h>
 
+#include "fio.h"
 #include "log.h"
 #include "mutex.h"
 #include "arch/arch.h"
@@ -16,6 +17,8 @@
 #include "time.h"
 #include "gettime.h"
 
+static clockid_t fio_clk_id = CLOCK_REALTIME;
+
 void fio_mutex_remove(struct fio_mutex *mutex)
 {
        pthread_cond_destroy(&mutex->cond);
@@ -62,9 +65,7 @@ struct fio_mutex *fio_mutex_init(int value)
        pthread_condattr_setpshared(&cond, PTHREAD_PROCESS_SHARED);
 #endif
 #ifdef FIO_HAVE_CLOCK_MONOTONIC
-       pthread_condattr_setclock(&cond, CLOCK_MONOTONIC);
-#else
-       pthread_condattr_setclock(&cond, CLOCK_REALTIME);
+       pthread_condattr_setclock(&cond, fio_clk_id);
 #endif
        pthread_cond_init(&mutex->cond, &cond);
 
@@ -98,11 +99,7 @@ int fio_mutex_down_timeout(struct fio_mutex *mutex, unsigned int seconds)
 
        fio_gettime(&tv_s, NULL);
 
-#ifdef FIO_HAVE_CLOCK_MONOTONIC
-       clock_gettime(CLOCK_MONOTONIC, &t);
-#else
-       clock_gettime(CLOCK_REALTIME, &t);
-#endif
+       clock_gettime(fio_clk_id, &t);
        t.tv_sec += seconds;
 
        pthread_mutex_lock(&mutex->lock);
@@ -202,3 +199,19 @@ void fio_mutex_up_write(struct fio_mutex *mutex)
                pthread_cond_signal(&mutex->cond);
        pthread_mutex_unlock(&mutex->lock);
 }
+
+static void fio_init fio_mutex_global_init(void)
+{
+#ifdef FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
+#ifdef FIO_HAVE_CLOCK_MONOTONIC
+       pthread_condattr_t cond;
+
+       pthread_condattr_init(&cond);
+
+       if (!pthread_condattr_setclock(&cond, CLOCK_MONOTONIC))
+               fio_clk_id = CLOCK_MONOTONIC;
+
+       pthread_condattr_destroy(&cond);
+#endif
+#endif
+}