#include "storage/proc.h"
#include "storage/smgr.h"
#include "storage/standby.h"
+#include "utils/memdebug.h"
#include "utils/ps_status.h"
#include "utils/rel.h"
#include "utils/resowner_private.h"
buf_state))
{
result = (buf_state & BM_VALID) != 0;
+
+ /*
+ * If we successfully acquired our first pin on this buffer
+ * within this backend, mark buffer contents defined
+ */
+ if (result)
+ VALGRIND_MAKE_MEM_DEFINED(BufHdrGetBlock(buf), BLCKSZ);
break;
}
}
*/
Assert(GetPrivateRefCountEntry(BufferDescriptorGetBuffer(buf), false) == NULL);
+ /*
+ * Buffer can't have a preexisting pin, so mark its page as defined to
+ * Valgrind (this is similar to the PinBuffer() case where the backend
+ * doesn't already have a buffer pin)
+ */
+ VALGRIND_MAKE_MEM_DEFINED(BufHdrGetBlock(buf), BLCKSZ);
+
/*
* Since we hold the buffer spinlock, we can update the buffer state and
* release the lock in one operation.
uint32 buf_state;
uint32 old_buf_state;
+ /* Mark undefined, now that no pins remain in backend */
+ VALGRIND_MAKE_MEM_NOACCESS(BufHdrGetBlock(buf), BLCKSZ);
+
/* I'd better not still hold any locks on the buffer */
Assert(!LWLockHeldByMe(BufferDescriptorGetContentLock(buf)));
Assert(!LWLockHeldByMe(BufferDescriptorGetIOLock(buf)));
/*
* Include Valgrind "client requests", mostly in the memory allocator, so
* Valgrind understands PostgreSQL memory contexts. This permits detecting
- * memory errors that Valgrind would not detect on a vanilla build. See also
- * src/tools/valgrind.supp. "make installcheck" runs 20-30x longer under
- * Valgrind. Note that USE_VALGRIND slowed older versions of Valgrind by an
- * additional order of magnitude; Valgrind 3.8.1 does not have this problem.
- * The client requests fall in hot code paths, so USE_VALGRIND also slows
- * native execution by a few percentage points.
+ * memory errors that Valgrind would not detect on a vanilla build. It also
+ * enables detection of buffer accesses that take place without holding a
+ * buffer pin. See also src/tools/valgrind.supp.
+ *
+ * "make installcheck" is significantly slower under Valgrind. The client
+ * requests fall in hot code paths, so USE_VALGRIND slows native execution by
+ * a few percentage points even when not run under Valgrind.
*
* You should normally use MEMORY_CONTEXT_CHECKING with USE_VALGRIND;
* instrumentation of repalloc() is inferior without it.