88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.76 2000/03/14 22:46:27 tgl Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.77 2000/03/31 02:43:31 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
1515/*
1616 *
1717 * BufferAlloc() -- lookup a buffer in the buffer table. If
18- *it isn't there add it, but do not readit into memory.
18+ *it isn't there add it, but do not readdata into memory.
1919 *This is used when we are about to reinitialize the
2020 *buffer so don't care what the current disk contents are.
21- *BufferAlloc() pins the new buffer in memory.
21+ *BufferAlloc()also pins the new buffer in memory.
2222 *
23- * ReadBuffer() --same as BufferAlloc() but reads the data
23+ * ReadBuffer() --like BufferAlloc() but reads the data
2424 *on a buffer cache miss.
2525 *
2626 * ReleaseBuffer() -- unpin the buffer
2727 *
2828 * WriteNoReleaseBuffer() -- mark the buffer contents as "dirty"
2929 *but don't unpin. The disk IO is delayed until buffer
30- *replacement if WriteMode is BUFFER_LATE_WRITE .
30+ *replacement.
3131 *
3232 * WriteBuffer() -- WriteNoReleaseBuffer() + ReleaseBuffer()
3333 *
34- * FlushBuffer() -- as above but never delayed write.
34+ * FlushBuffer() -- Write buffer immediately. Can unpin, or not,
35+ *depending on parameter.
3536 *
3637 * BufferSync() -- flush all dirty buffers in the buffer pool.
3738 *
@@ -70,11 +71,7 @@ extern long int LocalBufferFlushCount;
7071 */
7172bool SharedBufferChanged = false;
7273
73- static int WriteMode = BUFFER_LATE_WRITE ;/* Delayed write is
74- * default */
75-
7674static void WaitIO (BufferDesc * buf ,SPINLOCK spinlock );
77-
7875static void StartBufferIO (BufferDesc * buf ,bool forInput );
7976static void TerminateBufferIO (BufferDesc * buf );
8077static void ContinueBufferIO (BufferDesc * buf ,bool forInput );
@@ -97,7 +94,6 @@ static Buffer ReadBufferWithBufferLock(Relation relation, BlockNumber blockNum,
9794bool bufferLockHeld );
9895static BufferDesc * BufferAlloc (Relation reln ,BlockNumber blockNum ,
9996bool * foundPtr ,bool bufferLockHeld );
100- static int FlushBuffer (Buffer buffer ,bool release );
10197static void BufferSync (void );
10298static int BufferReplace (BufferDesc * bufHdr ,bool bufferLockHeld );
10399void PrintBufferDescs (void );
@@ -658,8 +654,7 @@ BufferAlloc(Relation reln,
658654/*
659655 * WriteBuffer
660656 *
661- *Pushes buffer contents to disk if WriteMode is BUFFER_FLUSH_WRITE.
662- *Otherwise, marks contents as dirty.
657+ *Marks buffer contents as dirty (actual write happens later).
663658 *
664659 * Assume that buffer is pinned. Assume that reln is
665660 *valid.
@@ -675,28 +670,23 @@ WriteBuffer(Buffer buffer)
675670{
676671BufferDesc * bufHdr ;
677672
678- if (WriteMode == BUFFER_FLUSH_WRITE )
679- return FlushBuffer (buffer , TRUE);
680- else
681- {
673+ if (BufferIsLocal (buffer ))
674+ return WriteLocalBuffer (buffer , TRUE);
682675
683- if (BufferIsLocal (buffer ))
684- return WriteLocalBuffer ( buffer , TRUE) ;
676+ if (BAD_BUFFER_ID (buffer ))
677+ return FALSE ;
685678
686- if (BAD_BUFFER_ID (buffer ))
687- return FALSE;
679+ bufHdr = & BufferDescriptors [buffer - 1 ];
688680
689- bufHdr = & BufferDescriptors [ buffer - 1 ] ;
681+ SharedBufferChanged = true ;
690682
691- SharedBufferChanged = true;
683+ SpinAcquire (BufMgrLock );
684+ Assert (bufHdr -> refcount > 0 );
685+ bufHdr -> flags |= (BM_DIRTY |BM_JUST_DIRTIED );
686+ UnpinBuffer (bufHdr );
687+ SpinRelease (BufMgrLock );
688+ CommitInfoNeedsSave [buffer - 1 ]= 0 ;
692689
693- SpinAcquire (BufMgrLock );
694- Assert (bufHdr -> refcount > 0 );
695- bufHdr -> flags |= (BM_DIRTY |BM_JUST_DIRTIED );
696- UnpinBuffer (bufHdr );
697- SpinRelease (BufMgrLock );
698- CommitInfoNeedsSave [buffer - 1 ]= 0 ;
699- }
700690return TRUE;
701691}
702692
@@ -778,9 +768,9 @@ DirtyBufferCopy(Oid dbid, Oid relid, BlockNumber blkno, char *dest)
778768 * 'buffer' is known to be dirty/pinned, so there should not be a
779769 * problem reading the BufferDesc members without the BufMgrLock
780770 * (nobody should be able to change tags, flags, etc. out from under
781- * us).
771+ * us). Unpin if 'release' is TRUE.
782772 */
783- static int
773+ int
784774FlushBuffer (Buffer buffer ,bool release )
785775{
786776BufferDesc * bufHdr ;
@@ -850,36 +840,27 @@ FlushBuffer(Buffer buffer, bool release)
850840/*
851841 * WriteNoReleaseBuffer -- like WriteBuffer, but do not unpin the buffer
852842 * when the operation is complete.
853- *
854- *We know that the buffer is for a relation in our private cache,
855- *because this routine is called only to write out buffers that
856- *were changed by the executing backend.
857843 */
858844int
859845WriteNoReleaseBuffer (Buffer buffer )
860846{
861847BufferDesc * bufHdr ;
862848
863- if (WriteMode == BUFFER_FLUSH_WRITE )
864- return FlushBuffer (buffer , FALSE);
865- else
866- {
849+ if (BufferIsLocal (buffer ))
850+ return WriteLocalBuffer (buffer , FALSE);
867851
868- if (BufferIsLocal (buffer ))
869- return WriteLocalBuffer ( buffer , FALSE) ;
852+ if (BAD_BUFFER_ID (buffer ))
853+ return STATUS_ERROR ;
870854
871- if (BAD_BUFFER_ID (buffer ))
872- return STATUS_ERROR ;
855+ bufHdr = & BufferDescriptors [buffer - 1 ];
873856
874- bufHdr = & BufferDescriptors [ buffer - 1 ] ;
857+ SharedBufferChanged = true ;
875858
876- SharedBufferChanged = true;
859+ SpinAcquire (BufMgrLock );
860+ bufHdr -> flags |= (BM_DIRTY |BM_JUST_DIRTIED );
861+ SpinRelease (BufMgrLock );
862+ CommitInfoNeedsSave [buffer - 1 ]= 0 ;
877863
878- SpinAcquire (BufMgrLock );
879- bufHdr -> flags |= (BM_DIRTY |BM_JUST_DIRTIED );
880- SpinRelease (BufMgrLock );
881- CommitInfoNeedsSave [buffer - 1 ]= 0 ;
882- }
883864return STATUS_OK ;
884865}
885866
@@ -2002,16 +1983,6 @@ _bm_die(Oid dbId, Oid relId, int blkNo, int bufNo,
20021983
20031984#endif /* BMTRACE */
20041985
2005- int
2006- SetBufferWriteMode (int mode )
2007- {
2008- int old ;
2009-
2010- old = WriteMode ;
2011- WriteMode = mode ;
2012- return old ;
2013- }
2014-
20151986void
20161987SetBufferCommitInfoNeedsSave (Buffer buffer )
20171988{