* local buffer manager. Fast buffer manager for temporary tables,
* which never need to be WAL-logged or checkpointed, etc.
*
- * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.53 2004/04/21 18:06:30 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.58 2004/08/29 04:12:47 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include "storage/bufmgr.h"
#include "storage/smgr.h"
#include "utils/relcache.h"
+#include "utils/resowner.h"
/*#define LBDEBUG*/
BufferDesc *LocalBufferDescriptors = NULL;
Block *LocalBufferBlockPointers = NULL;
-long *LocalRefCount = NULL;
+int32 *LocalRefCount = NULL;
static int nextFreeLocalBuf = 0;
#endif
LocalRefCount[i]++;
+ ResourceOwnerRememberBuffer(CurrentResourceOwner,
+ BufferDescriptorGetBuffer(bufHdr));
if (bufHdr->flags & BM_VALID)
*foundPtr = TRUE;
else
{
bufHdr = &LocalBufferDescriptors[b];
LocalRefCount[b]++;
+ ResourceOwnerRememberBuffer(CurrentResourceOwner,
+ BufferDescriptorGetBuffer(bufHdr));
nextFreeLocalBuf = (b + 1) % NLocBuffer;
break;
}
/* And write... */
smgrwrite(reln,
bufHdr->tag.blockNum,
- (char *) MAKE_PTR(bufHdr->data));
+ (char *) MAKE_PTR(bufHdr->data),
+ true);
LocalBufferFlushCount++;
}
{
Assert(LocalRefCount[bufid] > 0);
LocalRefCount[bufid]--;
+ ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
}
}
/*
* these aren't going away. I'm not gonna use palloc.
*/
- LocalBufferDescriptors =
- (BufferDesc *) calloc(NLocBuffer, sizeof(BufferDesc));
- LocalBufferBlockPointers = (Block *) calloc(NLocBuffer, sizeof(Block));
- LocalRefCount = (long *) calloc(NLocBuffer, sizeof(long));
+ LocalBufferDescriptors = (BufferDesc *)
+ calloc(NLocBuffer, sizeof(*LocalBufferDescriptors));
+ LocalBufferBlockPointers = (Block *)
+ calloc(NLocBuffer, sizeof(*LocalBufferBlockPointers));
+ LocalRefCount = (int32 *)
+ calloc(NLocBuffer, sizeof(*LocalRefCount));
nextFreeLocalBuf = 0;
for (i = 0; i < NLocBuffer; i++)
if (isCommit)
elog(WARNING,
- "local buffer leak: [%03d] (rel=%u/%u, blockNum=%u, flags=0x%x, refcount=%d %ld)",
+ "local buffer leak: [%03d] (rel=%u/%u/%u, blockNum=%u, flags=0x%x, refcount=%u %d)",
i,
- buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
- buf->tag.blockNum, buf->flags,
+ buf->tag.rnode.spcNode, buf->tag.rnode.dbNode,
+ buf->tag.rnode.relNode, buf->tag.blockNum, buf->flags,
buf->refcount, LocalRefCount[i]);
LocalRefCount[i] = 0;