@ -7,7 +7,7 @@
* Portions Copyright ( c ) 1996 - 2001 , PostgreSQL Global Development Group
* Portions Copyright ( c ) 1996 - 2001 , PostgreSQL Global Development Group
* Portions Copyright ( c ) 1994 , Regents of the University of California
* Portions Copyright ( c ) 1994 , Regents of the University of California
*
*
* $ Header : / cvsroot / pgsql / src / backend / access / transam / xlog . c , v 1.84 2001 / 12 / 23 07 : 25 : 39 tgl Exp $
* $ Header : / cvsroot / pgsql / src / backend / access / transam / xlog . c , v 1.85 2001 / 12 / 28 18 : 16 : 41 tgl Exp $
*
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
*/
@ -617,10 +617,15 @@ begin:;
START_CRIT_SECTION ( ) ;
START_CRIT_SECTION ( ) ;
/* update LogwrtResult before doing cache fill check */
/* update LogwrtResult before doing cache fill check */
SpinLockAcquire_NoHoldoff ( & XLogCtl - > info_lck ) ;
{
LogwrtRqst = XLogCtl - > LogwrtRqst ;
/* use volatile pointer to prevent code rearrangement */
LogwrtResult = XLogCtl - > LogwrtResult ;
volatile XLogCtlData * xlogctl = XLogCtl ;
SpinLockRelease_NoHoldoff ( & XLogCtl - > info_lck ) ;
SpinLockAcquire_NoHoldoff ( & xlogctl - > info_lck ) ;
LogwrtRqst = xlogctl - > LogwrtRqst ;
LogwrtResult = xlogctl - > LogwrtResult ;
SpinLockRelease_NoHoldoff ( & xlogctl - > info_lck ) ;
}
/*
/*
* If cache is half filled then try to acquire write lock and do
* If cache is half filled then try to acquire write lock and do
@ -838,16 +843,20 @@ begin:;
if ( updrqst )
if ( updrqst )
{
{
SpinLockAcquire_NoHoldoff ( & XLogCtl - > info_lck ) ;
/* use volatile pointer to prevent code rearrangement */
volatile XLogCtlData * xlogctl = XLogCtl ;
SpinLockAcquire_NoHoldoff ( & xlogctl - > info_lck ) ;
/* advance global request to include new block(s) */
/* advance global request to include new block(s) */
if ( XLByteLT ( XLogCtl - > LogwrtRqst . Write , WriteRqst ) )
if ( XLByteLT ( xlogc tl- > LogwrtRqst . Write , WriteRqst ) )
XLogCtl - > LogwrtRqst . Write = WriteRqst ;
xlogc tl- > LogwrtRqst . Write = WriteRqst ;
/* update local result copy while I have the chance */
/* update local result copy while I have the chance */
LogwrtResult = XLogC tl- > LogwrtResult ;
LogwrtResult = xlogc tl- > LogwrtResult ;
SpinLockRelease_NoHoldoff ( & XLogC tl- > info_lck ) ;
SpinLockRelease_NoHoldoff ( & xlogc tl- > info_lck ) ;
}
}
END_CRIT_SECTION ( ) ;
END_CRIT_SECTION ( ) ;
return ( RecPtr ) ;
return ( RecPtr ) ;
}
}
@ -892,11 +901,16 @@ AdvanceXLInsertBuffer(void)
FinishedPageRqstPtr = XLogCtl - > xlblocks [ Insert - > curridx ] ;
FinishedPageRqstPtr = XLogCtl - > xlblocks [ Insert - > curridx ] ;
/* Before waiting, get info_lck and update LogwrtResult */
/* Before waiting, get info_lck and update LogwrtResult */
SpinLockAcquire_NoHoldoff ( & XLogCtl - > info_lck ) ;
{
if ( XLByteLT ( XLogCtl - > LogwrtRqst . Write , FinishedPageRqstPtr ) )
/* use volatile pointer to prevent code rearrangement */
XLogCtl - > LogwrtRqst . Write = FinishedPageRqstPtr ;
volatile XLogCtlData * xlogctl = XLogCtl ;
LogwrtResult = XLogCtl - > LogwrtResult ;
SpinLockRelease_NoHoldoff ( & XLogCtl - > info_lck ) ;
SpinLockAcquire_NoHoldoff ( & xlogctl - > info_lck ) ;
if ( XLByteLT ( xlogctl - > LogwrtRqst . Write , FinishedPageRqstPtr ) )
xlogctl - > LogwrtRqst . Write = FinishedPageRqstPtr ;
LogwrtResult = xlogctl - > LogwrtResult ;
SpinLockRelease_NoHoldoff ( & xlogctl - > info_lck ) ;
}
update_needed = false ; /* Did the shared-request update */
update_needed = false ; /* Did the shared-request update */
@ -1149,13 +1163,18 @@ XLogWrite(XLogwrtRqst WriteRqst)
* ' result ' values . This is not absolutely essential , but it saves
* ' result ' values . This is not absolutely essential , but it saves
* some code in a couple of places .
* some code in a couple of places .
*/
*/
SpinLockAcquire_NoHoldoff ( & XLogCtl - > info_lck ) ;
{
XLogCtl - > LogwrtResult = LogwrtResult ;
/* use volatile pointer to prevent code rearrangement */
if ( XLByteLT ( XLogCtl - > LogwrtRqst . Write , LogwrtResult . Write ) )
volatile XLogCtlData * xlogctl = XLogCtl ;
XLogCtl - > LogwrtRqst . Write = LogwrtResult . Write ;
if ( XLByteLT ( XLogCtl - > LogwrtRqst . Flush , LogwrtResult . Flush ) )
SpinLockAcquire_NoHoldoff ( & xlogctl - > info_lck ) ;
XLogCtl - > LogwrtRqst . Flush = LogwrtResult . Flush ;
xlogctl - > LogwrtResult = LogwrtResult ;
SpinLockRelease_NoHoldoff ( & XLogCtl - > info_lck ) ;
if ( XLByteLT ( xlogctl - > LogwrtRqst . Write , LogwrtResult . Write ) )
xlogctl - > LogwrtRqst . Write = LogwrtResult . Write ;
if ( XLByteLT ( xlogctl - > LogwrtRqst . Flush , LogwrtResult . Flush ) )
xlogctl - > LogwrtRqst . Flush = LogwrtResult . Flush ;
SpinLockRelease_NoHoldoff ( & xlogctl - > info_lck ) ;
}
Write - > LogwrtResult = LogwrtResult ;
Write - > LogwrtResult = LogwrtResult ;
}
}
@ -1206,11 +1225,16 @@ XLogFlush(XLogRecPtr record)
WriteRqstPtr = record ;
WriteRqstPtr = record ;
/* read LogwrtResult and update local state */
/* read LogwrtResult and update local state */
SpinLockAcquire_NoHoldoff ( & XLogCtl - > info_lck ) ;
{
if ( XLByteLT ( WriteRqstPtr , XLogCtl - > LogwrtRqst . Write ) )
/* use volatile pointer to prevent code rearrangement */
WriteRqstPtr = XLogCtl - > LogwrtRqst . Write ;
volatile XLogCtlData * xlogctl = XLogCtl ;
LogwrtResult = XLogCtl - > LogwrtResult ;
SpinLockRelease_NoHoldoff ( & XLogCtl - > info_lck ) ;
SpinLockAcquire_NoHoldoff ( & xlogctl - > info_lck ) ;
if ( XLByteLT ( WriteRqstPtr , xlogctl - > LogwrtRqst . Write ) )
WriteRqstPtr = xlogctl - > LogwrtRqst . Write ;
LogwrtResult = xlogctl - > LogwrtResult ;
SpinLockRelease_NoHoldoff ( & xlogctl - > info_lck ) ;
}
/* done already? */
/* done already? */
if ( ! XLByteLE ( record , LogwrtResult . Flush ) )
if ( ! XLByteLE ( record , LogwrtResult . Flush ) )