1616 *
1717 *
1818 * IDENTIFICATION
19- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/localbuf.c,v 1.35 2000/11/20 16:47:32 petere Exp $
19+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/localbuf.c,v 1.36 2000/11/30 01:39:07 tgl Exp $
2020 *
2121 *-------------------------------------------------------------------------
2222 */
3333#include <signal.h>
3434
3535#include "executor/execdebug.h"
36+ #include "storage/buf_internals.h"
37+ #include "storage/bufmgr.h"
3638#include "storage/smgr.h"
3739#include "utils/relcache.h"
3840
3941extern long int LocalBufferFlushCount ;
4042
4143int NLocBuffer = 64 ;
4244BufferDesc * LocalBufferDescriptors = NULL ;
45+ Block * LocalBufferBlockPointers = NULL ;
4346long * LocalRefCount = NULL ;
4447
4548static int nextFreeLocalBuf = 0 ;
@@ -135,14 +138,24 @@ LocalBufferAlloc(Relation reln, BlockNumber blockNum, bool *foundPtr)
135138 bufHdr -> flags &= ~BM_DIRTY ;
136139
137140 /*
138- * lazy memory allocation. (see MAKE_PTR for why we need to do
139- * MAKE_OFFSET.)
141+ * lazy memory allocation: allocate space on first use of a buffer.
140142 */
141143 if (bufHdr -> data == (SHMEM_OFFSET ) 0 )
142144 {
143145 char * data = (char * ) malloc (BLCKSZ );
144146
147+ if (data == NULL )
148+ elog (FATAL , "Out of memory in LocalBufferAlloc" );
149+ /*
150+ * This is a bit of a hack: bufHdr->data needs to be a shmem offset
151+ * for consistency with the shared-buffer case, so make it one
152+ * even though it's not really a valid shmem offset.
153+ */
145154 bufHdr -> data = MAKE_OFFSET (data );
155+ /*
156+ * Set pointer for use by BufferGetBlock() macro.
157+ */
158+ LocalBufferBlockPointers [- (bufHdr -> buf_id + 2 )] = (Block ) data ;
146159 }
147160
148161 * foundPtr = FALSE;
@@ -223,7 +236,7 @@ FlushLocalBuffer(Buffer buffer, bool sync, bool release)
223236/*
224237 * InitLocalBuffer -
225238 * init the local buffer cache. Since most queries (esp. multi-user ones)
226- * don't involve local buffers, we delay allocating memory for actual the
239+ * don't involve local buffers, we delay allocating actual memory for the
227240 * buffer until we need it.
228241 */
229242void
@@ -235,8 +248,9 @@ InitLocalBuffer(void)
235248 * these aren't going away. I'm not gonna use palloc.
236249 */
237250 LocalBufferDescriptors =
238- (BufferDesc * ) malloc (sizeof (BufferDesc ) * NLocBuffer );
239- MemSet (LocalBufferDescriptors , 0 , sizeof (BufferDesc ) * NLocBuffer );
251+ (BufferDesc * ) calloc (NLocBuffer , sizeof (BufferDesc ));
252+ LocalBufferBlockPointers = (Block * ) calloc (NLocBuffer , sizeof (Block ));
253+ LocalRefCount = (long * ) calloc (NLocBuffer , sizeof (long ));
240254 nextFreeLocalBuf = 0 ;
241255
242256 for (i = 0 ; i < NLocBuffer ; i ++ )
@@ -251,9 +265,6 @@ InitLocalBuffer(void)
251265 */
252266 buf -> buf_id = - i - 2 ;
253267 }
254-
255- LocalRefCount = (long * ) malloc (sizeof (long ) * NLocBuffer );
256- MemSet (LocalRefCount , 0 , sizeof (long ) * NLocBuffer );
257268}
258269
259270/*
@@ -308,7 +319,6 @@ ResetLocalBufferPool(void)
308319
309320 buf -> tag .rnode .relNode = InvalidOid ;
310321 buf -> flags &= ~BM_DIRTY ;
311- buf -> buf_id = - i - 2 ;
312322 }
313323
314324 MemSet (LocalRefCount , 0 , sizeof (long ) * NLocBuffer );
0 commit comments