From a7e12772e3414d71e491647f46a8efffda1e88af Mon Sep 17 00:00:00 2001 From: Alexandre Felipe Date: Mon, 24 Aug 2026 20:48:09 +0100 Subject: [PATCH 4/5] mode as a dynamic parameter Just to check the impact the branches in the code. Passing the mode as a variable, to the same implementation makes it about 50% (on one machine). op | avg | min | q1 | med | q3 | max | std ----------------+-------+------+-------+-------+-------+--------+------ spin-lock | 13.89 | 7.49 | 12.04 | 15.30 | 15.95 | 23.11 | 3.26 LWLock-ex | 6.50 | 5.53 | 6.19 | 6.19 | 6.51 | 26.37 | 0.85 LWLock-sh | 6.48 | 5.86 | 6.19 | 6.19 | 6.52 | 10.74 | 0.58 LWLock-dynmode | 9.47 | 7.81 | 9.11 | 9.44 | 9.77 | 14.65 | 0.96 lw-ex-mode | 9.39 | 8.46 | 8.79 | 9.12 | 9.44 | 117.51 | 3.82 lw-ex-last | 6.16 | 5.53 | 5.86 | 6.18 | 6.19 | 9.11 | 0.54 lw-sh-mode | 9.22 | 8.46 | 8.79 | 9.12 | 9.44 | 13.67 | 0.83 lw-sh-last | 6.09 | 5.53 | 5.86 | 5.86 | 6.19 | 19.20 | 0.68 LWLock-cond | 6.01 | 5.20 | 5.53 | 5.86 | 6.51 | 10.09 | 0.68 nop | 0.84 | 0.32 | 0.65 | 0.98 | 0.98 | 2.28 | 0.20 --- src/backend/storage/lmgr/lwlock.c | 12 +++++++++++- src/include/storage/lwlock.h | 2 ++ src/test/modules/microbench/lwlock/bench.c | 10 ++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 444b5ed37ec..00b589f158e 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -1308,7 +1308,10 @@ LWLockAcquireCommon(LWLock *lock, LWLockMode mode) return result; } - +bool LWLockAcquireX(LWLock *lock, LWLockMode mode) +{ + return LWLockAcquireCommon(lock, mode); +} /* * LWLockAcquireExclusive - acquire an exclusive lock * @@ -1914,6 +1917,13 @@ LWLockReleaseCommon(LWLock *lock, LWLockMode mode) LWLockReleaseInternal(lock, mode); } + +extern void +LWLockReleaseX(LWLock *lock, LWLockMode mode) +{ + LWLockReleaseCommon(lock, mode); +} + /* * LWLockReleaseExclusive * diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index aa113b7ddb2..dec4119d638 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -123,6 +123,8 @@ inline bool LWLockAcquire(LWLock *lock, LWLockMode mode) else return LWLockAcquireShared(lock); } +bool LWLockAcquireX(LWLock *lock, LWLockMode mode); +void LWLockReleaseX(LWLock *lock, LWLockMode mode); extern bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode); extern bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode); diff --git a/src/test/modules/microbench/lwlock/bench.c b/src/test/modules/microbench/lwlock/bench.c index d15939801d7..93d2e52c254 100644 --- a/src/test/modules/microbench/lwlock/bench.c +++ b/src/test/modules/microbench/lwlock/bench.c @@ -99,6 +99,16 @@ bench_lwlock(PG_FUNCTION_ARGS) } END_TIMING; + + BEGIN_TIMING("LWLock-X", n) + { + LWLock *lock = locks[i]; + + LWLockAcquireX(lock, LW_SHARED); + LWLockReleaseX(lock, LW_SHARED); + } + END_TIMING; + BEGIN_TIMING("lw-ex-mode", n) { LWLock *lock = locks[i]; -- 2.53.0