summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorTom Lane2005-10-12 16:45:14 +0000
committerTom Lane2005-10-12 16:45:14 +0000
commit07eeb9d109c057854b20707562ce517efa591761 (patch)
treec327a5d0acf471e00737609bf8ddd3fbbd18ee66 /contrib
parent6b97e437ca20cbfcff059c668516c59914f5ba4d (diff)
Do all accesses to shared buffer headers through volatile-qualified
pointers, to ensure that compilers won't rearrange accesses to occur while we're not holding the buffer header spinlock. It's probably not necessary to mark volatile in every single place in bufmgr.c, but better safe than sorry. Per trouble report from Kevin Grittner.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/pg_buffercache/pg_buffercache_pages.c27
1 files changed, 7 insertions, 20 deletions
diff --git a/contrib/pg_buffercache/pg_buffercache_pages.c b/contrib/pg_buffercache/pg_buffercache_pages.c
index e55aff991dc..e511c0df9ad 100644
--- a/contrib/pg_buffercache/pg_buffercache_pages.c
+++ b/contrib/pg_buffercache/pg_buffercache_pages.c
@@ -3,7 +3,7 @@
* pg_buffercache_pages.c
* display some contents of the buffer cache
*
- * $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.4 2005/05/31 00:07:47 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.5 2005/10/12 16:45:13 tgl Exp $
*-------------------------------------------------------------------------
*/
#include "postgres.h"
@@ -72,10 +72,8 @@ pg_buffercache_pages(PG_FUNCTION_ARGS)
if (SRF_IS_FIRSTCALL())
{
- RelFileNode rnode;
uint32 i;
- BufferDesc *bufHdr;
-
+ volatile BufferDesc *bufHdr;
funcctx = SRF_FIRSTCALL_INIT();
@@ -136,35 +134,24 @@ pg_buffercache_pages(PG_FUNCTION_ARGS)
/* Lock each buffer header before inspecting. */
LockBufHdr(bufHdr);
- rnode = bufHdr->tag.rnode;
-
fctx->record[i].bufferid = BufferDescriptorGetBuffer(bufHdr);
- fctx->record[i].relfilenode = rnode.relNode;
- fctx->record[i].reltablespace = rnode.spcNode;
- fctx->record[i].reldatabase = rnode.dbNode;
+ fctx->record[i].relfilenode = bufHdr->tag.rnode.relNode;
+ fctx->record[i].reltablespace = bufHdr->tag.rnode.spcNode;
+ fctx->record[i].reldatabase = bufHdr->tag.rnode.dbNode;
fctx->record[i].blocknum = bufHdr->tag.blockNum;
- if ( bufHdr->flags & BM_DIRTY)
- {
+ if (bufHdr->flags & BM_DIRTY)
fctx->record[i].isdirty = true;
- }
else
- {
fctx->record[i].isdirty = false;
- }
/* Note if the buffer is valid, and has storage created */
- if ( (bufHdr->flags & BM_VALID) && (bufHdr->flags & BM_TAG_VALID))
- {
+ if ((bufHdr->flags & BM_VALID) && (bufHdr->flags & BM_TAG_VALID))
fctx->record[i].isvalid = true;
- }
else
- {
fctx->record[i].isvalid = false;
- }
UnlockBufHdr(bufHdr);
-
}
/* Release Buffer map. */