X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=mutex.c;h=bcc37ae648c0bf440949603d762463a1ea74a7f8;hp=f3c8326663f1d8b350a4b6cc0afd484111682711;hb=64d4d313ef4f537408d28fac863cf2a2b0f00175;hpb=28cfeb6851703cf12b54b3a06bf3ff611198933e diff --git a/mutex.c b/mutex.c index f3c83266..bcc37ae6 100644 --- a/mutex.c +++ b/mutex.c @@ -90,3 +90,39 @@ void fio_mutex_up(struct fio_mutex *mutex) mutex->value++; pthread_mutex_unlock(&mutex->lock); } + +void fio_mutex_down_write(struct fio_mutex *mutex) +{ + pthread_mutex_lock(&mutex->lock); + while (mutex->value != 0) + pthread_cond_wait(&mutex->cond, &mutex->lock); + mutex->value--; + pthread_mutex_unlock(&mutex->lock); +} + +void fio_mutex_down_read(struct fio_mutex *mutex) +{ + pthread_mutex_lock(&mutex->lock); + while (mutex->value < 0) + pthread_cond_wait(&mutex->cond, &mutex->lock); + mutex->value++; + pthread_mutex_unlock(&mutex->lock); +} + +void fio_mutex_up_read(struct fio_mutex *mutex) +{ + pthread_mutex_lock(&mutex->lock); + mutex->value--; + if (mutex->value >= 0) + pthread_cond_signal(&mutex->cond); + pthread_mutex_unlock(&mutex->lock); +} + +void fio_mutex_up_write(struct fio_mutex *mutex) +{ + pthread_mutex_lock(&mutex->lock); + mutex->value++; + if (mutex->value >= 0) + pthread_cond_signal(&mutex->cond); + pthread_mutex_unlock(&mutex->lock); +}