From 9552f54f43fa7cf72ca7b0f99370d456d703733f Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 12 Aug 2013 00:11:49 +1000 Subject: [PATCH] Add the ability to downgrade a write variant of the cglocks. --- miner.h | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/miner.h b/miner.h index 61a082b2..0ac23f82 100644 --- a/miner.h +++ b/miner.h @@ -754,17 +754,28 @@ static inline void rw_unlock(pthread_rwlock_t *lock) { if (unlikely(pthread_rwlock_unlock(lock))) quit(1, "WTF RWLOCK ERROR ON UNLOCK!"); - sched_yield(); +} + +static inline void rd_unlock_noyield(pthread_rwlock_t *lock) +{ + rw_unlock(lock); +} + +static inline void wr_unlock_noyield(pthread_rwlock_t *lock) +{ + rw_unlock(lock); } static inline void rd_unlock(pthread_rwlock_t *lock) { rw_unlock(lock); + sched_yield(); } static inline void wr_unlock(pthread_rwlock_t *lock) { rw_unlock(lock); + sched_yield(); } static inline void mutex_init(pthread_mutex_t *lock) @@ -820,6 +831,14 @@ static inline void cg_wlock(cglock_t *lock) wr_lock(&lock->rwlock); } +/* Downgrade write variant to a read lock */ +static inline void cg_dwlock(cglock_t *lock) +{ + wr_unlock_noyield(&lock->rwlock); + rd_lock(&lock->rwlock); + mutex_unlock_noyield(&lock->mutex); +} + /* Downgrade intermediate variant to a read lock */ static inline void cg_dlock(cglock_t *lock) {