aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/buf_table.c
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>2003-11-13 05:34:58 +0000
committerJan Wieck <JanWieck@Yahoo.com>2003-11-13 05:34:58 +0000
commit923e994d7901d7c0268725e219002af3b2d40dfc (patch)
tree74346d015a246ecb57b4bb4f4c25974f571b3265 /src/backend/storage/buffer/buf_table.c
parent256d2f09b58c45ad8ddda8f46d22915a8eaa5600 (diff)
downloadpostgresql-923e994d7901d7c0268725e219002af3b2d40dfc.tar.gz
postgresql-923e994d7901d7c0268725e219002af3b2d40dfc.zip
ARC strategy backed out ... sorry
Jan
Diffstat (limited to 'src/backend/storage/buffer/buf_table.c')
-rw-r--r--src/backend/storage/buffer/buf_table.c68
1 files changed, 42 insertions, 26 deletions
diff --git a/src/backend/storage/buffer/buf_table.c b/src/backend/storage/buffer/buf_table.c
index a2318a29f36..95db86c5348 100644
--- a/src/backend/storage/buffer/buf_table.c
+++ b/src/backend/storage/buffer/buf_table.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_table.c,v 1.30 2003/11/13 00:40:01 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_table.c,v 1.31 2003/11/13 05:34:58 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -38,7 +38,7 @@ static HTAB *SharedBufHash;
* Initialize shmem hash table for mapping buffers
*/
void
-InitBufTable(int size)
+InitBufTable(void)
{
HASHCTL info;
@@ -50,7 +50,7 @@ InitBufTable(int size)
info.hash = tag_hash;
SharedBufHash = ShmemInitHash("Shared Buffer Lookup Table",
- size, size,
+ NBuffers, NBuffers,
&info,
HASH_ELEM | HASH_FUNCTION);
@@ -58,63 +58,79 @@ InitBufTable(int size)
elog(FATAL, "could not initialize shared buffer hash table");
}
-/*
- * BufTableLookup
- */
-int
+BufferDesc *
BufTableLookup(BufferTag *tagPtr)
{
BufferLookupEnt *result;
if (tagPtr->blockNum == P_NEW)
- return -1;
+ return NULL;
result = (BufferLookupEnt *)
hash_search(SharedBufHash, (void *) tagPtr, HASH_FIND, NULL);
if (!result)
- return -1;
+ return NULL;
- return result->id;
+ return &(BufferDescriptors[result->id]);
}
/*
* BufTableDelete
*/
bool
-BufTableInsert(BufferTag *tagPtr, Buffer buf_id)
+BufTableDelete(BufferDesc *buf)
{
BufferLookupEnt *result;
- bool found;
- result = (BufferLookupEnt *)
- hash_search(SharedBufHash, (void *) tagPtr, HASH_ENTER, &found);
+ /*
+ * buffer not initialized or has been removed from table already.
+ * BM_DELETED keeps us from removing buffer twice.
+ */
+ if (buf->flags & BM_DELETED)
+ return TRUE;
- if (!result)
- ereport(ERROR,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of shared memory")));
+ buf->flags |= BM_DELETED;
- if (found) /* found something else in the table? */
+ result = (BufferLookupEnt *)
+ hash_search(SharedBufHash, (void *) &(buf->tag), HASH_REMOVE, NULL);
+
+ if (!result) /* shouldn't happen */
elog(ERROR, "shared buffer hash table corrupted");
- result->id = buf_id;
+ /*
+ * Clear the buffer's tag. This doesn't matter for the hash table,
+ * since the buffer is already removed from it, but it ensures that
+ * sequential searches through the buffer table won't think the buffer
+ * is still valid for its old page.
+ */
+ buf->tag.rnode.relNode = InvalidOid;
+ buf->tag.rnode.tblNode = InvalidOid;
+
return TRUE;
}
-/*
- * BufTableDelete
- */
bool
-BufTableDelete(BufferTag *tagPtr)
+BufTableInsert(BufferDesc *buf)
{
BufferLookupEnt *result;
+ bool found;
+
+ /* cannot insert it twice */
+ Assert(buf->flags & BM_DELETED);
+ buf->flags &= ~(BM_DELETED);
result = (BufferLookupEnt *)
- hash_search(SharedBufHash, (void *) tagPtr, HASH_REMOVE, NULL);
+ hash_search(SharedBufHash, (void *) &(buf->tag), HASH_ENTER, &found);
- if (!result) /* shouldn't happen */
+ if (!result)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of shared memory")));
+
+ if (found) /* found something else in the table? */
elog(ERROR, "shared buffer hash table corrupted");
+ result->id = buf->buf_id;
return TRUE;
}