From b11e4ccf7b3d24e8e1d0a779aa6735bbce85b291 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 20 Feb 2012 09:18:43 +0100 Subject: [PATCH 1/1] mutex: don't attempt to use CLOCK_MONOTONIC It's a bit of a mess. Some platforms don't have pthread_condattr_setclock(), some have it but it appears NOT to set the block correctly. Accept that we have to use the realtime clock for timed mutex and just don't touch the clock settings. Signed-off-by: Jens Axboe --- mutex.c | 28 +++------------------------- os/os-aix.h | 1 - os/os-freebsd.h | 1 - os/os-linux.h | 1 - 4 files changed, 3 insertions(+), 28 deletions(-) diff --git a/mutex.c b/mutex.c index 94e11884..3b94beff 100644 --- a/mutex.c +++ b/mutex.c @@ -17,8 +17,6 @@ #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); @@ -63,9 +61,6 @@ struct fio_mutex *fio_mutex_init(int value) pthread_condattr_init(&cond); #ifdef FIO_HAVE_PSHARED_MUTEX pthread_condattr_setpshared(&cond, PTHREAD_PROCESS_SHARED); -#endif -#ifdef FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK - pthread_condattr_setclock(&cond, fio_clk_id); #endif pthread_cond_init(&mutex->cond, &cond); @@ -97,10 +92,9 @@ int fio_mutex_down_timeout(struct fio_mutex *mutex, unsigned int seconds) struct timespec t; int ret = 0; - fio_gettime(&tv_s, NULL); - - clock_gettime(fio_clk_id, &t); - t.tv_sec += seconds; + gettimeofday(&tv_s, NULL); + t.tv_sec = tv_s.tv_sec + seconds; + t.tv_nsec = tv_s.tv_usec * 1000; pthread_mutex_lock(&mutex->lock); @@ -199,19 +193,3 @@ 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 3cbc80f3..2f75bf8f 100644 --- a/os/os-aix.h +++ b/os/os-aix.h @@ -14,7 +14,6 @@ #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 976bd842..9fbc6236 100644 --- a/os/os-freebsd.h +++ b/os/os-freebsd.h @@ -19,7 +19,6 @@ #define FIO_HAVE_CHARDEV_SIZE #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 61dfa303..9f547fff 100644 --- a/os/os-linux.h +++ b/os/os-linux.h @@ -44,7 +44,6 @@ #define FIO_HAVE_TRIM #define FIO_HAVE_BINJECT #define FIO_HAVE_CLOCK_MONOTONIC -#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK #define FIO_HAVE_GETTID /* -- 2.25.1