diff --git a/src/spinlock.c b/src/spinlock.c index 34a4462..f62b898 100644 --- a/src/spinlock.c +++ b/src/spinlock.c @@ -39,9 +39,8 @@ static inline int fc_futex(int *ptr, int op, int val) int fc_spinlock_init(FCSpinlock *lock, int *cond) { #ifdef OS_LINUX - lock->mutex = 0; lock->cond = cond; - return 0; + return pthread_spin_init(&lock->mutex, 0); #else return init_pthread_lock_cond_pair(&lock->lcp); #endif @@ -58,7 +57,7 @@ void fc_spinlock_destroy(FCSpinlock *lock) int fc_spinlock_lock(FCSpinlock *lock) { #ifdef OS_LINUX - return fc_futex(&lock->mutex, FUTEX_LOCK_PI_PRIVATE, 0); + return pthread_spin_lock(&lock->mutex); #else return pthread_mutex_lock(&lock->lcp.lock); #endif @@ -67,7 +66,7 @@ int fc_spinlock_lock(FCSpinlock *lock) int fc_spinlock_trylock(FCSpinlock *lock) { #ifdef OS_LINUX - return fc_futex(&lock->mutex, FUTEX_TRYLOCK_PI_PRIVATE, 0); + return pthread_spin_trylock(&lock->mutex); #else return pthread_mutex_trylock(&lock->lcp.lock); #endif @@ -76,7 +75,7 @@ int fc_spinlock_trylock(FCSpinlock *lock) int fc_spinlock_unlock(FCSpinlock *lock) { #ifdef OS_LINUX - return fc_futex(&lock->mutex, FUTEX_UNLOCK_PI_PRIVATE, 0); + return pthread_spin_unlock(&lock->mutex); #else return pthread_mutex_unlock(&lock->lcp.lock); #endif @@ -88,11 +87,11 @@ int fc_spinlock_wait(FCSpinlock *lock, const int expected) int result; int lock_ret; - if ((result=fc_futex(&lock->mutex, FUTEX_UNLOCK_PI_PRIVATE, 0)) != 0) { + if ((result=pthread_spin_unlock(&lock->mutex)) != 0) { return result; } result = fc_futex(lock->cond, FUTEX_WAIT_PRIVATE, expected); - lock_ret = fc_futex(&lock->mutex, FUTEX_LOCK_PI_PRIVATE, 0); + lock_ret = pthread_spin_lock(&lock->mutex); return result == 0 ? lock_ret : result; #else return pthread_cond_wait(&lock->lcp.cond, &lock->lcp.lock); diff --git a/src/spinlock.h b/src/spinlock.h index 9790a51..be07cea 100644 --- a/src/spinlock.h +++ b/src/spinlock.h @@ -21,7 +21,7 @@ typedef struct fc_spinlock_t { #ifdef OS_LINUX - int mutex; + pthread_spinlock_t mutex; int *cond; #else pthread_lock_cond_pair_t lcp;