From a7e12772e3414d71e491647f46a8efffda1e88af Mon Sep 17 00:00:00 2001
From: Alexandre Felipe <o.alexandre.felipe@gmail.com>
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

