mutex: more clock fixes
authorJens Axboe <axboe@kernel.dk>
Thu, 16 Feb 2012 21:22:46 +0000 (22:22 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 16 Feb 2012 21:22:46 +0000 (22:22 +0100)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
mutex.c
os/os-aix.h
os/os-freebsd.h
os/os-linux.h
os/os-mac.h

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
+}
index 2f75bf8f3f45fec7f0bdcc1f0234cd3b43172a2c..3cbc80f32c47fd681505ac2916037289cc4154ba 100644 (file)
@@ -14,6 +14,7 @@
 #define FIO_HAVE_ODIRECT
 #define FIO_USE_GENERIC_RAND
 #define FIO_HAVE_CLOCK_MONOTONIC
+#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
 
 /*
  * This is broken on AIX if _LARGE_FILES is defined...
index 93205c32280d282d36175f13217aa8f80ce733f7..976bd8427007bbb2a01573a02c30c4c24c6eab36 100644 (file)
@@ -17,8 +17,9 @@
 #define FIO_HAVE_STRSEP
 #define FIO_USE_GENERIC_RAND
 #define FIO_HAVE_CHARDEV_SIZE
-#define FIO_HAVE_CLOCK_MONOTONIC
 #define FIO_HAVE_GETTID
+#define FIO_HAVE_CLOCK_MONOTONIC
+#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
 
 #define OS_MAP_ANON            MAP_ANON
 
index 9f547fffe635ad0f652b1baa6a579032bdacc801..61dfa30315c9d05e319866465dcc78a963e87db7 100644 (file)
@@ -44,6 +44,7 @@
 #define FIO_HAVE_TRIM
 #define FIO_HAVE_BINJECT
 #define FIO_HAVE_CLOCK_MONOTONIC
+#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
 #define FIO_HAVE_GETTID
 
 /*
index aec30f962e5ccf403edb5d69692253f2bb550071..e4c2bc8e4fc87cb9421cf1a3cac21b9af11a3f28 100644 (file)
@@ -29,6 +29,7 @@
 #define FIO_USE_GENERIC_RAND
 #define FIO_HAVE_GETTID
 #define FIO_HAVE_CHARDEV_SIZE
+#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
 
 #define OS_MAP_ANON            MAP_ANON