#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));
}
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;
}
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);
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)