From: Jens Axboe Date: Wed, 15 Feb 2012 21:24:19 +0000 (+0100) Subject: Mutex timeout work-around X-Git-Tag: fio-2.0.4~28 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=ef6350576b1053b0491b17932dc29740d749ad4a Mutex timeout work-around Signed-off-by: Jens Axboe --- diff --git a/mutex.c b/mutex.c index 24defcf5..cc4e353d 100644 --- a/mutex.c +++ b/mutex.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -12,6 +13,8 @@ #include "arch/arch.h" #include "os/os.h" #include "helpers.h" +#include "time.h" +#include "gettime.h" void fio_mutex_remove(struct fio_mutex *mutex) { @@ -82,11 +85,19 @@ err: return NULL; } +static int mutex_timed_out(struct timeval *t, unsigned int seconds) +{ + return mtime_since_now(t) >= seconds * 1000; +} + int fio_mutex_down_timeout(struct fio_mutex *mutex, unsigned int seconds) { + struct timeval tv_s; struct timespec t; int ret = 0; + fio_gettime(&tv_s, NULL); + #ifdef FIO_HAVE_CLOCK_MONOTONIC clock_gettime(CLOCK_MONOTONIC, &t); #else @@ -98,7 +109,17 @@ int fio_mutex_down_timeout(struct fio_mutex *mutex, unsigned int seconds) while (!mutex->value && !ret) { mutex->waiters++; + + /* + * Some platforms (FreeBSD 9?) seems to return timed out + * way too early, double check. + */ ret = pthread_cond_timedwait(&mutex->cond, &mutex->lock, &t); + if (ret == ETIMEDOUT && !mutex_timed_out(&tv_s, seconds)) { + pthread_mutex_lock(&mutex->lock); + ret = 0; + } + mutex->waiters--; }