From 88ac59be4d7540bb7b6087397eb2ed9aa5f57066 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 6 Nov 2017 01:03:26 +0100 Subject: [PATCH] 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. --- include/common/hathreads.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/common/hathreads.h b/include/common/hathreads.h index 853c9f167..0a9098dbe 100644 --- a/include/common/hathreads.h +++ b/include/common/hathreads.h @@ -191,9 +191,9 @@ extern struct lock_stat lock_stats[LOCK_LABELS]; #define __SPIN_INIT(l) ({ (*l) = 0; }) #define __SPIN_DESTROY(l) ({ (*l) = 0; }) -#define __SPIN_LOCK(l) pl_take_w(l) -#define __SPIN_TRYLOCK(l) !pl_try_w(l) -#define __SPIN_UNLOCK(l) pl_drop_w(l) +#define __SPIN_LOCK(l) pl_take_s(l) +#define __SPIN_TRYLOCK(l) !pl_try_s(l) +#define __SPIN_UNLOCK(l) pl_drop_s(l) #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_DESTROY(l) ({ (*l) = 0; }) -#define SPIN_LOCK(lbl, l) pl_take_w(l) -#define SPIN_TRYLOCK(lbl, l) !pl_try_w(l) -#define SPIN_UNLOCK(lbl, l) pl_drop_w(l) +#define SPIN_LOCK(lbl, l) pl_take_s(l) +#define SPIN_TRYLOCK(lbl, l) !pl_try_s(l) +#define SPIN_UNLOCK(lbl, l) pl_drop_s(l) #define HA_RWLOCK_T unsigned long