bool *foundPtr);
static void FlushBuffer(volatile BufferDesc *buf, SMgrRelation reln);
static void AtProcExit_Buffers(int code, Datum arg);
+static void CheckForBufferLeaks(void);
static int rnode_comparator(const void *p1, const void *p2);
return result | BUF_WRITTEN;
}
-
/*
* AtEOXact_Buffers - clean up at end of transaction.
- *
- * As of PostgreSQL 8.0, buffer pins should get released by the
- * ResourceOwner mechanism. This routine is just a debugging
- * cross-check that no pins remain.
*/
void
AtEOXact_Buffers(bool isCommit)
{
-#ifdef USE_ASSERT_CHECKING
- if (assert_enabled)
- {
- int RefCountErrors = 0;
- Buffer b;
-
- for (b = 1; b <= NBuffers; b++)
- {
- if (PrivateRefCount[b - 1] != 0)
- {
- PrintBufferLeakWarning(b);
- RefCountErrors++;
- }
- }
- Assert(RefCountErrors == 0);
- }
-#endif
+ CheckForBufferLeaks();
AtEOXact_LocalBuffers(isCommit);
}
AbortBufferIO();
UnlockBuffers();
+ CheckForBufferLeaks();
+
+ /* localbuf.c needs a chance too */
+ AtProcExit_LocalBuffers();
+}
+
+/*
+ * CheckForBufferLeaks - ensure this backend holds no buffer pins
+ *
+ * As of PostgreSQL 8.0, buffer pins should get released by the
+ * ResourceOwner mechanism. This routine is just a debugging
+ * cross-check that no pins remain.
+ */
+static void
+CheckForBufferLeaks(void)
+{
#ifdef USE_ASSERT_CHECKING
- if (assert_enabled)
- {
- int RefCountErrors = 0;
- Buffer b;
+ int RefCountErrors = 0;
+ Buffer b;
- for (b = 1; b <= NBuffers; b++)
+ for (b = 1; b <= NBuffers; b++)
+ {
+ if (PrivateRefCount[b - 1] != 0)
{
- if (PrivateRefCount[b - 1] != 0)
- {
- PrintBufferLeakWarning(b);
- RefCountErrors++;
- }
+ PrintBufferLeakWarning(b);
+ RefCountErrors++;
}
- Assert(RefCountErrors == 0);
}
+ Assert(RefCountErrors == 0);
#endif
-
- /* localbuf.c needs a chance too */
- AtProcExit_LocalBuffers();
}
/*