From: Simon Riggs Date: Mon, 5 Sep 2016 09:38:08 +0000 (+0100) Subject: Add debug check function LWLockHeldByMeInMode() X-Git-Tag: REL_10_BETA1~1774 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=016abf1fb8333de82a259af0cc7572a4b868023b;p=postgresql Add debug check function LWLockHeldByMeInMode() Tests whether my process holds a lock in given mode. Add initial usage in MarkBufferDirty(). Thomas Munro --- diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 76ade3727c..90804a3c53 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1460,8 +1460,8 @@ MarkBufferDirty(Buffer buffer) bufHdr = GetBufferDescriptor(buffer - 1); Assert(BufferIsPinned(buffer)); - /* unfortunately we can't check if the lock is held exclusively */ - Assert(LWLockHeldByMe(BufferDescriptorGetContentLock(bufHdr))); + Assert(LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr), + LW_EXCLUSIVE)); old_buf_state = pg_atomic_read_u32(&bufHdr->state); for (;;) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 53b45d72fe..9d08de75ae 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -1880,10 +1880,9 @@ LWLockReleaseAll(void) /* - * LWLockHeldByMe - test whether my process currently holds a lock + * LWLockHeldByMe - test whether my process holds a lock in any mode * - * This is meant as debug support only. We currently do not distinguish - * whether the lock is held shared or exclusive. + * This is meant as debug support only. */ bool LWLockHeldByMe(LWLock *l) @@ -1897,3 +1896,21 @@ LWLockHeldByMe(LWLock *l) } return false; } + +/* + * LWLockHeldByMeInMode - test whether my process holds a lock in given mode + * + * This is meant as debug support only. + */ +bool +LWLockHeldByMeInMode(LWLock *l, LWLockMode mode) +{ + int i; + + for (i = 0; i < num_held_lwlocks; i++) + { + if (held_lwlocks[i].lock == l && held_lwlocks[i].mode == mode) + return true; + } + return false; +} diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 959f5f1e4d..18931eb046 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -175,6 +175,7 @@ extern void LWLockRelease(LWLock *lock); extern void LWLockReleaseClearVar(LWLock *lock, uint64 *valptr, uint64 val); extern void LWLockReleaseAll(void); extern bool LWLockHeldByMe(LWLock *lock); +extern bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode); extern bool LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval); extern void LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 value);