From d40fd85187d06f7bd16fb4d0067bad0b1d248718 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 15 Jan 2026 14:54:16 -0500 Subject: [PATCH] lwlock: Remove support for disowned lwlwocks This reverts commit f8d7f29b3e81db59b95e4b5baaa6943178c89fd8, plus parts of subsequent commits fixing a typo in a parameter name. Support for disowned lwlocks was added for the benefit of AIO, to be able to have content locks "owned" by the AIO subsystem. But as of commit fcb9c977aa5, content locks do not use lwlocks anymore. It does not seem particularly likely that we need this facility outside of the AIO use-case, therefore remove the now unused functions. I did choose to keep the comment added in the aforementioned commit about lock->owner intentionally being left pointing to the last owner. Reviewed-by: Chao Li Discussion: https://postgr.es/m/cj5mcjdpucvw4a54hehslr3ctukavrbnxltvuzzhqnimvpju5e@cy3g3mnsefwz --- src/backend/storage/lmgr/lwlock.c | 71 +++---------------------------- src/include/storage/lwlock.h | 2 - 2 files changed, 6 insertions(+), 67 deletions(-) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 2ee0339c52e..a133c97b992 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -1783,25 +1783,18 @@ LWLockUpdateVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 val) /* - * Stop treating lock as held by current backend. - * - * This is the code that can be shared between actually releasing a lock - * (LWLockRelease()) and just not tracking ownership of the lock anymore - * without releasing the lock (LWLockDisown()). - * - * Returns the mode in which the lock was held by the current backend. - * - * NB: This does not call RESUME_INTERRUPTS(), but leaves that responsibility - * of the caller. + * LWLockRelease - release a previously acquired lock * * NB: This will leave lock->owner pointing to the current backend (if * LOCK_DEBUG is set). This is somewhat intentional, as it makes it easier to * debug cases of missing wakeups during lock release. */ -static inline LWLockMode -LWLockDisownInternal(LWLock *lock) +void +LWLockRelease(LWLock *lock) { LWLockMode mode; + uint32 oldstate; + bool check_waiters; int i; /* @@ -1821,18 +1814,7 @@ LWLockDisownInternal(LWLock *lock) for (; i < num_held_lwlocks; i++) held_lwlocks[i] = held_lwlocks[i + 1]; - return mode; -} - -/* - * Helper function to release lock, shared between LWLockRelease() and - * LWLockReleaseDisowned(). - */ -static void -LWLockReleaseInternal(LWLock *lock, LWLockMode mode) -{ - uint32 oldstate; - bool check_waiters; + PRINT_LWDEBUG("LWLockRelease", lock, mode); /* * Release my hold on lock, after that it can immediately be acquired by @@ -1870,38 +1852,6 @@ LWLockReleaseInternal(LWLock *lock, LWLockMode mode) LOG_LWDEBUG("LWLockRelease", lock, "releasing waiters"); LWLockWakeup(lock); } -} - - -/* - * Stop treating lock as held by current backend. - * - * After calling this function it's the callers responsibility to ensure that - * the lock gets released (via LWLockReleaseDisowned()), even in case of an - * error. This only is desirable if the lock is going to be released in a - * different process than the process that acquired it. - */ -void -LWLockDisown(LWLock *lock) -{ - LWLockDisownInternal(lock); - - RESUME_INTERRUPTS(); -} - -/* - * LWLockRelease - release a previously acquired lock - */ -void -LWLockRelease(LWLock *lock) -{ - LWLockMode mode; - - mode = LWLockDisownInternal(lock); - - PRINT_LWDEBUG("LWLockRelease", lock, mode); - - LWLockReleaseInternal(lock, mode); /* * Now okay to allow cancel/die interrupts. @@ -1909,15 +1859,6 @@ LWLockRelease(LWLock *lock) RESUME_INTERRUPTS(); } -/* - * Release lock previously disowned with LWLockDisown(). - */ -void -LWLockReleaseDisowned(LWLock *lock, LWLockMode mode) -{ - LWLockReleaseInternal(lock, mode); -} - /* * LWLockReleaseClearVar - release a previously acquired lock, reset variable */ diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index df589902adc..9a0290391d0 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -127,8 +127,6 @@ extern bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode); extern void LWLockRelease(LWLock *lock); extern void LWLockReleaseClearVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 val); extern void LWLockReleaseAll(void); -extern void LWLockDisown(LWLock *lock); -extern void LWLockReleaseDisowned(LWLock *lock, LWLockMode mode); extern bool LWLockHeldByMe(LWLock *lock); extern bool LWLockAnyHeldByMe(LWLock *lock, int nlocks, size_t stride); extern bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode);