From: Jens Axboe Date: Thu, 16 Feb 2012 21:22:46 +0000 (+0100) Subject: mutex: more clock fixes X-Git-Tag: fio-2.0.4~27 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=b4c1fb368f9863449e4c0312df845b58f8b67717;ds=inline mutex: more clock fixes Signed-off-by: Jens Axboe --- diff --git a/mutex.c b/mutex.c index cc4e353d..ff6ec730 100644 --- a/mutex.c +++ b/mutex.c @@ -8,6 +8,7 @@ #include #include +#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 +} diff --git a/os/os-aix.h b/os/os-aix.h index 2f75bf8f..3cbc80f3 100644 --- a/os/os-aix.h +++ b/os/os-aix.h @@ -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... diff --git a/os/os-freebsd.h b/os/os-freebsd.h index 93205c32..976bd842 100644 --- a/os/os-freebsd.h +++ b/os/os-freebsd.h @@ -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 diff --git a/os/os-linux.h b/os/os-linux.h index 9f547fff..61dfa303 100644 --- a/os/os-linux.h +++ b/os/os-linux.h @@ -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 /* diff --git a/os/os-mac.h b/os/os-mac.h index aec30f96..e4c2bc8e 100644 --- a/os/os-mac.h +++ b/os/os-mac.h @@ -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