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 <axboe@kernel.dk>
#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_init(&cond);
#ifdef FIO_HAVE_PSHARED_MUTEX
pthread_condattr_setpshared(&cond, PTHREAD_PROCESS_SHARED);
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);
#endif
pthread_cond_init(&mutex->cond, &cond);
struct timespec t;
int ret = 0;
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);
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_CHARDEV_SIZE
#define FIO_HAVE_GETTID
#define FIO_HAVE_CLOCK_MONOTONIC
#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
#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
/*