From 06bd992f4be2f46586bfc7bab3135b3a2ca84e72 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 29 Jul 2024 09:48:26 -0700 Subject: [PATCH v1] Detect unlocking an unlocked spinlock Author: Reviewed-by: Discussion: https://postgr.es/m/20240729164026.yurg37tej34o76uk@awork3.anarazel.de Backpatch: --- src/include/storage/spin.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/include/storage/spin.h b/src/include/storage/spin.h index c0679c59992..7ec32cd816a 100644 --- a/src/include/storage/spin.h +++ b/src/include/storage/spin.h @@ -61,7 +61,22 @@ #define SpinLockAcquire(lock) S_LOCK(lock) -#define SpinLockRelease(lock) S_UNLOCK(lock) +static inline void +SpinLockRelease(volatile slock_t *lock) +{ + /* + * Check that this backend actually held the spinlock. Implemented as a + * static inline to avoid multiple-evaluation hazards. + * + * Can't assert when using the semaphore fallback implementation - it + * doesn't implement S_LOCK_FREE() - but the fallback triggers failures in + * the case of double-release on its own. + */ +#ifdef HAVE_SPINLOCKS + Assert(!S_LOCK_FREE(lock)); +#endif + S_UNLOCK(lock); +} #define SpinLockFree(lock) S_LOCK_FREE(lock) -- 2.45.2.746.g06e570c0df.dirty