From: Willy Tarreau Date: Mon, 6 Nov 2017 00:03:26 +0000 (+0100) Subject: MINOR: threads: use faster locks for the spin locks X-Git-Tag: v1.8-rc3~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=88ac59be4d7540bb7b6087397eb2ed9aa5f57066;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/common/hathreads.h b/include/common/hathreads.h index 853c9f1674..0a9098dbe6 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