diff options
author | Jan Wieck <JanWieck@Yahoo.com> | 2003-11-13 00:40:02 +0000 |
---|---|---|
committer | Jan Wieck <JanWieck@Yahoo.com> | 2003-11-13 00:40:02 +0000 |
commit | 48adc0b34b3de911eccb2a80c78b137aa631f199 (patch) | |
tree | 49f62ee74ea9a3e86854bcab68f4ff4b061cda39 /src/backend/storage/buffer/buf_table.c | |
parent | 27e8ef05350ee9e681ed5d456526ac5abf5cd889 (diff) | |
download | postgresql-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.c | 68 |
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; } |