aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/buf_table.c
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>2003-11-13 00:40:02 +0000
committerJan Wieck <JanWieck@Yahoo.com>2003-11-13 00:40:02 +0000
commit48adc0b34b3de911eccb2a80c78b137aa631f199 (patch)
tree49f62ee74ea9a3e86854bcab68f4ff4b061cda39 /src/backend/storage/buffer/buf_table.c
parent27e8ef05350ee9e681ed5d456526ac5abf5cd889 (diff)
downloadpostgresql-48adc0b34b3de911eccb2a80c78b137aa631f199.tar.gz
postgresql-48adc0b34b3de911eccb2a80c78b137aa631f199.zip
Replacement of the buffer replacement strategy with an ARC
algorithm adopted for PostgreSQL. Jan
Diffstat (limited to 'src/backend/storage/buffer/buf_table.c')
-rw-r--r--src/backend/storage/buffer/buf_table.c68
1 files changed, 26 insertions, 42 deletions
diff --git a/src/backend/storage/buffer/buf_table.c b/src/backend/storage/buffer/buf_table.c
index 072288e330e..a2318a29f36 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.29 2003/08/04 02:40:03 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_table.c,v 1.30 2003/11/13 00:40:01 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -38,7 +38,7 @@ static HTAB *SharedBufHash;
* Initialize shmem hash table for mapping buffers
*/
void
-InitBufTable(void)
+InitBufTable(int size)
{
HASHCTL info;
@@ -50,7 +50,7 @@ InitBufTable(void)
info.hash = tag_hash;
SharedBufHash = ShmemInitHash("Shared Buffer Lookup Table",
- NBuffers, NBuffers,
+ size, size,
&info,
HASH_ELEM | HASH_FUNCTION);
@@ -58,79 +58,63 @@ InitBufTable(void)
elog(FATAL, "could not initialize shared buffer hash table");
}
-BufferDesc *
+/*
+ * BufTableLookup
+ */
+int
BufTableLookup(BufferTag *tagPtr)
{
BufferLookupEnt *result;
if (tagPtr->blockNum == P_NEW)
- return NULL;
+ return -1;
result = (BufferLookupEnt *)
hash_search(SharedBufHash, (void *) tagPtr, HASH_FIND, NULL);
if (!result)
- return NULL;
+ return -1;
- return &(BufferDescriptors[result->id]);
+ return result->id;
}
/*
* BufTableDelete
*/
bool
-BufTableDelete(BufferDesc *buf)
+BufTableInsert(BufferTag *tagPtr, Buffer buf_id)
{
BufferLookupEnt *result;
-
- /*
- * 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;
-
- buf->flags |= BM_DELETED;
+ bool found;
result = (BufferLookupEnt *)
- hash_search(SharedBufHash, (void *) &(buf->tag), HASH_REMOVE, NULL);
+ hash_search(SharedBufHash, (void *) tagPtr, HASH_ENTER, &found);
- if (!result) /* shouldn't happen */
- elog(ERROR, "shared buffer hash table corrupted");
+ if (!result)
+ ereport(ERROR,
+ (errcode(ERRCODE_OUT_OF_MEMORY),
+ errmsg("out of shared memory")));
- /*
- * 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;
+ if (found) /* found something else in the table? */
+ elog(ERROR, "shared buffer hash table corrupted");
+ result->id = buf_id;
return TRUE;
}
+/*
+ * BufTableDelete
+ */
bool
-BufTableInsert(BufferDesc *buf)
+BufTableDelete(BufferTag *tagPtr)
{
BufferLookupEnt *result;
- bool found;
-
- /* cannot insert it twice */
- Assert(buf->flags & BM_DELETED);
- buf->flags &= ~(BM_DELETED);
result = (BufferLookupEnt *)
- hash_search(SharedBufHash, (void *) &(buf->tag), HASH_ENTER, &found);
-
- if (!result)
- ereport(ERROR,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of shared memory")));
+ hash_search(SharedBufHash, (void *) tagPtr, HASH_REMOVE, NULL);
- if (found) /* found something else in the table? */
+ if (!result) /* shouldn't happen */
elog(ERROR, "shared buffer hash table corrupted");
- result->id = buf->buf_id;
return TRUE;
}