MINOR: threads: use faster locks for the spin locks

The spin locks used to rely on W locks, which involve a loop waiting
for readers to leave, and this doesn't happen here. It's more efficient
to use S locks instead, which are also mutually exclusive and do not
have this loop. This saves one test per spinlock and a few tens of
bytes allowing certain functions to be inlined.
This commit is contained in:
Willy Tarreau 2017-11-06 01:03:26 +01:00
parent ce4e0aa7f3
commit 88ac59be4d

View File

@ -191,9 +191,9 @@ extern struct lock_stat lock_stats[LOCK_LABELS];
#define __SPIN_INIT(l) ({ (*l) = 0; }) #define __SPIN_INIT(l) ({ (*l) = 0; })
#define __SPIN_DESTROY(l) ({ (*l) = 0; }) #define __SPIN_DESTROY(l) ({ (*l) = 0; })
#define __SPIN_LOCK(l) pl_take_w(l) #define __SPIN_LOCK(l) pl_take_s(l)
#define __SPIN_TRYLOCK(l) !pl_try_w(l) #define __SPIN_TRYLOCK(l) !pl_try_s(l)
#define __SPIN_UNLOCK(l) pl_drop_w(l) #define __SPIN_UNLOCK(l) pl_drop_s(l)
#define __HA_RWLOCK_T unsigned long #define __HA_RWLOCK_T unsigned long
@ -552,9 +552,9 @@ static inline void __spin_unlock(enum lock_label lbl, struct ha_spinlock *l,
#define SPIN_INIT(l) ({ (*l) = 0; }) #define SPIN_INIT(l) ({ (*l) = 0; })
#define SPIN_DESTROY(l) ({ (*l) = 0; }) #define SPIN_DESTROY(l) ({ (*l) = 0; })
#define SPIN_LOCK(lbl, l) pl_take_w(l) #define SPIN_LOCK(lbl, l) pl_take_s(l)
#define SPIN_TRYLOCK(lbl, l) !pl_try_w(l) #define SPIN_TRYLOCK(lbl, l) !pl_try_s(l)
#define SPIN_UNLOCK(lbl, l) pl_drop_w(l) #define SPIN_UNLOCK(lbl, l) pl_drop_s(l)
#define HA_RWLOCK_T unsigned long #define HA_RWLOCK_T unsigned long