11 #include "arch/arch.h"
13 void fio_mutex_remove(struct fio_mutex *mutex)
15 close(mutex->mutex_fd);
16 munmap((void *) mutex, sizeof(*mutex));
19 struct fio_mutex *fio_mutex_init(int value)
21 char mutex_name[] = "/tmp/.fio_mutex.XXXXXX";
22 struct fio_mutex *mutex = NULL;
23 pthread_mutexattr_t attr;
24 pthread_condattr_t cond;
27 fd = mkstemp(mutex_name);
33 if (ftruncate(fd, sizeof(struct fio_mutex)) < 0) {
34 perror("ftruncate mutex");
38 mutex = (void *) mmap(NULL, sizeof(struct fio_mutex),
39 PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
40 if (mutex == MAP_FAILED) {
51 ret = pthread_mutexattr_init(&attr);
53 log_err("pthread_mutexattr_init: %s\n", strerror(ret));
56 ret = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
58 log_err("pthread_mutexattr_setpshared: %s\n", strerror(ret));
62 pthread_condattr_init(&cond);
63 pthread_condattr_setpshared(&cond, PTHREAD_PROCESS_SHARED);
64 pthread_cond_init(&mutex->cond, &cond);
66 ret = pthread_mutex_init(&mutex->lock, &attr);
68 log_err("pthread_mutex_init: %s\n", strerror(ret));
75 fio_mutex_remove(mutex);
81 void fio_mutex_down(struct fio_mutex *mutex)
83 pthread_mutex_lock(&mutex->lock);
85 while (!mutex->value) {
87 pthread_cond_wait(&mutex->cond, &mutex->lock);
92 pthread_mutex_unlock(&mutex->lock);
95 void fio_mutex_up(struct fio_mutex *mutex)
97 pthread_mutex_lock(&mutex->lock);
99 if (!mutex->value && mutex->waiters)
100 pthread_cond_signal(&mutex->cond);
102 pthread_mutex_unlock(&mutex->lock);
105 void fio_mutex_down_write(struct fio_mutex *mutex)
107 pthread_mutex_lock(&mutex->lock);
109 while (mutex->value != 0) {
111 pthread_cond_wait(&mutex->cond, &mutex->lock);
116 pthread_mutex_unlock(&mutex->lock);
119 void fio_mutex_down_read(struct fio_mutex *mutex)
121 pthread_mutex_lock(&mutex->lock);
123 while (mutex->value < 0) {
125 pthread_cond_wait(&mutex->cond, &mutex->lock);
130 pthread_mutex_unlock(&mutex->lock);
133 void fio_mutex_up_read(struct fio_mutex *mutex)
135 pthread_mutex_lock(&mutex->lock);
138 if (mutex->value >= 0 && mutex->waiters)
139 pthread_cond_signal(&mutex->cond);
140 pthread_mutex_unlock(&mutex->lock);
143 void fio_mutex_up_write(struct fio_mutex *mutex)
145 pthread_mutex_lock(&mutex->lock);
148 if (mutex->value >= 0 && mutex->waiters)
149 pthread_cond_signal(&mutex->cond);
150 pthread_mutex_unlock(&mutex->lock);