X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=mutex.c;h=7612b32ba26d89e06f55116f0dc236fef5ebfe70;hp=9d10c2ce2fe056fefd300ebf16274f85701fa7c6;hb=155f2f027b34321f6f5abe79c09ece8ecca25046;hpb=370c2c87bcb4dbcff279fe7235752ed97a04dcab diff --git a/mutex.c b/mutex.c index 9d10c2ce..7612b32b 100644 --- a/mutex.c +++ b/mutex.c @@ -18,10 +18,15 @@ #include "fio_time.h" #include "gettime.h" -void fio_mutex_remove(struct fio_mutex *mutex) +void __fio_mutex_remove(struct fio_mutex *mutex) { assert(mutex->magic == FIO_MUTEX_MAGIC); pthread_cond_destroy(&mutex->cond); +} + +void fio_mutex_remove(struct fio_mutex *mutex) +{ + __fio_mutex_remove(mutex); munmap((void *) mutex, sizeof(*mutex)); } @@ -87,7 +92,7 @@ struct fio_mutex *fio_mutex_init(int value) return NULL; } -static int mutex_timed_out(struct timeval *t, unsigned int seconds) +static bool mutex_timed_out(struct timeval *t, unsigned int seconds) { return mtime_since_now(t) >= seconds * 1000; } @@ -128,16 +133,16 @@ int fio_mutex_down_timeout(struct fio_mutex *mutex, unsigned int seconds) return ret; } -int fio_mutex_down_trylock(struct fio_mutex *mutex) +bool fio_mutex_down_trylock(struct fio_mutex *mutex) { - int ret = 1; + bool ret = true; assert(mutex->magic == FIO_MUTEX_MAGIC); pthread_mutex_lock(&mutex->lock); if (mutex->value) { mutex->value--; - ret = 0; + ret = false; } pthread_mutex_unlock(&mutex->lock); @@ -162,14 +167,19 @@ void fio_mutex_down(struct fio_mutex *mutex) void fio_mutex_up(struct fio_mutex *mutex) { + int do_wake = 0; + assert(mutex->magic == FIO_MUTEX_MAGIC); pthread_mutex_lock(&mutex->lock); read_barrier(); if (!mutex->value && mutex->waiters) - pthread_cond_signal(&mutex->cond); + do_wake = 1; mutex->value++; pthread_mutex_unlock(&mutex->lock); + + if (do_wake) + pthread_cond_signal(&mutex->cond); } void fio_rwlock_write(struct fio_rwlock *lock)