void fio_mutex_remove(struct fio_mutex *mutex)
{
- assert(mutex->magic = FIO_MUTEX_MAGIC);
+ assert(mutex->magic == FIO_MUTEX_MAGIC);
pthread_cond_destroy(&mutex->cond);
munmap((void *) mutex, sizeof(*mutex));
}
struct timespec t;
int ret = 0;
- assert(mutex->magic = FIO_MUTEX_MAGIC);
+ assert(mutex->magic == FIO_MUTEX_MAGIC);
gettimeofday(&tv_s, NULL);
t.tv_sec = tv_s.tv_sec + seconds;
void fio_mutex_down(struct fio_mutex *mutex)
{
- assert(mutex->magic = FIO_MUTEX_MAGIC);
+ assert(mutex->magic == FIO_MUTEX_MAGIC);
pthread_mutex_lock(&mutex->lock);
void fio_mutex_up(struct fio_mutex *mutex)
{
- assert(mutex->magic = FIO_MUTEX_MAGIC);
+ assert(mutex->magic == FIO_MUTEX_MAGIC);
pthread_mutex_lock(&mutex->lock);
read_barrier();
void fio_rwlock_write(struct fio_rwlock *lock)
{
- assert(lock->magic = FIO_RWLOCK_MAGIC);
+ assert(lock->magic == FIO_RWLOCK_MAGIC);
pthread_rwlock_wrlock(&lock->lock);
}
void fio_rwlock_read(struct fio_rwlock *lock)
{
- assert(lock->magic = FIO_RWLOCK_MAGIC);
+ assert(lock->magic == FIO_RWLOCK_MAGIC);
pthread_rwlock_rdlock(&lock->lock);
}
void fio_rwlock_unlock(struct fio_rwlock *lock)
{
- assert(lock->magic = FIO_RWLOCK_MAGIC);
+ assert(lock->magic == FIO_RWLOCK_MAGIC);
pthread_rwlock_unlock(&lock->lock);
}
void fio_rwlock_remove(struct fio_rwlock *lock)
{
- assert(lock->magic = FIO_RWLOCK_MAGIC);
+ assert(lock->magic == FIO_RWLOCK_MAGIC);
munmap((void *) lock, sizeof(*lock));
}
struct fio_rwlock *fio_rwlock_init(void)
{
struct fio_rwlock *lock;
+ pthread_rwlockattr_t attr;
int ret;
lock = (void *) mmap(NULL, sizeof(struct fio_rwlock),
lock->magic = FIO_RWLOCK_MAGIC;
+ ret = pthread_rwlockattr_init(&attr);
+ if (ret) {
+ log_err("pthread_rwlockattr_init: %s\n", strerror(ret));
+ goto err;
+ }
+#ifdef FIO_HAVE_PSHARED_MUTEX
+ ret = pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ if (ret) {
+ log_err("pthread_rwlockattr_setpshared: %s\n", strerror(ret));
+ goto destroy_attr;
+ }
+
+ ret = pthread_rwlock_init(&lock->lock, &attr);
+#else
ret = pthread_rwlock_init(&lock->lock, NULL);
+#endif
+
if (ret) {
log_err("pthread_rwlock_init: %s\n", strerror(ret));
- goto err;
+ goto destroy_attr;
}
+ pthread_rwlockattr_destroy(&attr);
+
return lock;
+destroy_attr:
+ pthread_rwlockattr_destroy(&attr);
err:
if (lock)
fio_rwlock_remove(lock);