Signed-off-by: Jens Axboe <axboe@kernel.dk>
#include <pthread.h>
#include <sys/mman.h>
#include <pthread.h>
#include <sys/mman.h>
#include "log.h"
#include "mutex.h"
#include "arch/arch.h"
#include "log.h"
#include "mutex.h"
#include "arch/arch.h"
#include "time.h"
#include "gettime.h"
#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);
void fio_mutex_remove(struct fio_mutex *mutex)
{
pthread_cond_destroy(&mutex->cond);
pthread_condattr_setpshared(&cond, PTHREAD_PROCESS_SHARED);
#endif
#ifdef FIO_HAVE_CLOCK_MONOTONIC
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);
#endif
pthread_cond_init(&mutex->cond, &cond);
fio_gettime(&tv_s, NULL);
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);
t.tv_sec += seconds;
pthread_mutex_lock(&mutex->lock);
pthread_cond_signal(&mutex->cond);
pthread_mutex_unlock(&mutex->lock);
}
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
+}
#define FIO_HAVE_ODIRECT
#define FIO_USE_GENERIC_RAND
#define FIO_HAVE_CLOCK_MONOTONIC
#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...
/*
* This is broken on AIX if _LARGE_FILES is defined...
#define FIO_HAVE_STRSEP
#define FIO_USE_GENERIC_RAND
#define FIO_HAVE_CHARDEV_SIZE
#define FIO_HAVE_STRSEP
#define FIO_USE_GENERIC_RAND
#define FIO_HAVE_CHARDEV_SIZE
-#define FIO_HAVE_CLOCK_MONOTONIC
+#define FIO_HAVE_CLOCK_MONOTONIC
+#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
#define OS_MAP_ANON MAP_ANON
#define OS_MAP_ANON MAP_ANON
#define FIO_HAVE_TRIM
#define FIO_HAVE_BINJECT
#define FIO_HAVE_CLOCK_MONOTONIC
#define FIO_HAVE_TRIM
#define FIO_HAVE_BINJECT
#define FIO_HAVE_CLOCK_MONOTONIC
+#define FIO_HAVE_PTHREAD_CONDATTR_SETCLOCK
#define FIO_HAVE_GETTID
/*
#define FIO_HAVE_GETTID
/*
#define FIO_USE_GENERIC_RAND
#define FIO_HAVE_GETTID
#define FIO_HAVE_CHARDEV_SIZE
#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
#define OS_MAP_ANON MAP_ANON