0003-bufmgr-Add-BufferLockHeldByMe.patch
text/x-patch
Filename: 0003-bufmgr-Add-BufferLockHeldByMe.patch
Type: text/x-patch
Part: 2
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0003
Subject: bufmgr: Add BufferLockHeldByMe()
| File | + | − |
|---|---|---|
| src/backend/storage/buffer/bufmgr.c | 41 | 0 |
| src/include/storage/bufmgr.h | 1 | 0 |
From 7c88c351bcca4b85fe0b56810e6d2f612fb622cf Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 23 Sep 2024 12:51:37 -0400
Subject: [PATCH 03/12] bufmgr: Add BufferLockHeldByMe()
Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
src/backend/storage/buffer/bufmgr.c | 41 +++++++++++++++++++++++++++++
src/include/storage/bufmgr.h | 1 +
2 files changed, 42 insertions(+)
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index f9681d09e1e..8be8908c39c 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -5873,6 +5873,47 @@ IsBufferCleanupOK(Buffer buffer)
return false;
}
+/*
+ * BufferLockHeldByMe - does the backend have the buffer locked?
+ *
+ * This likely should only be used for asserts etc.
+ *
+ * Note that this can only be called for non-temp buffers - there is no
+ * correct value to return for temporary buffers. One might think that just
+ * returning true for temp buffers would work, but the caller might assert
+ * that a lock is *not* held.
+ */
+bool
+BufferLockHeldByMe(Buffer buffer, int mode)
+{
+ BufferDesc *buf;
+ LWLockMode lwmode;
+
+ /*
+ * Can't hold a lock without a pin, there never should be uncertainty
+ * about having a pin.
+ */
+ Assert(BufferIsPinned(buffer));
+
+ /* there'd be no correct value to return */
+ Assert(!BufferIsLocal(buffer));
+
+ buf = GetBufferDescriptor(buffer - 1);
+
+ if (mode == BUFFER_LOCK_EXCLUSIVE)
+ lwmode = LW_EXCLUSIVE;
+ else if (mode == BUFFER_LOCK_SHARE)
+ lwmode = LW_SHARED;
+ else
+ {
+ Assert(false);
+ pg_unreachable();
+ lwmode = LW_EXCLUSIVE; /* assuage compiler */
+ }
+
+ return LWLockHeldByMeInMode(BufferDescriptorGetContentLock(buf), lwmode);
+}
+
/*
* Functions for buffer I/O handling
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index f2192ceb271..7c6b6df29aa 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -294,6 +294,7 @@ extern void LockBufferForCleanup(Buffer buffer);
extern bool ConditionalLockBufferForCleanup(Buffer buffer);
extern bool IsBufferCleanupOK(Buffer buffer);
extern bool HoldingBufferPinThatDelaysRecovery(void);
+extern bool BufferLockHeldByMe(Buffer buffer, int mode);
extern bool BgBufferSync(struct WritebackContext *wb_context);
--
2.39.5