]> granicus.if.org Git - postgresql/commitdiff
Add debug check function LWLockHeldByMeInMode()
authorSimon Riggs <simon@2ndQuadrant.com>
Mon, 5 Sep 2016 09:38:08 +0000 (10:38 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Mon, 5 Sep 2016 09:38:08 +0000 (10:38 +0100)
Tests whether my process holds a lock in given mode.
Add initial usage in MarkBufferDirty().

Thomas Munro

src/backend/storage/buffer/bufmgr.c
src/backend/storage/lmgr/lwlock.c
src/include/storage/lwlock.h

index 76ade3727cd0ee8dc7364fdae21789c6a26847d0..90804a3c530a1e9916fdaed0d4ac9da17bc43f1b 100644 (file)
@@ -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 (;;)
index 53b45d72fe0ed14806c44871b936680bae34b766..9d08de75ae51769497a292b836825b7c4a72deec 100644 (file)
@@ -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;
+}
index 959f5f1e4d24e80d78650b8dc5eecd78622e82a6..18931eb046943cccbf909c3e363fda8dc097860f 100644 (file)
@@ -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);