66 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
77 * Portions Copyright (c) 1994, Regents of the University of California
88 *
9- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.38 2000/11/30 08:46:22 vadim Exp $
9+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.39 2000/12/03 10:27:26 vadim Exp $
1010 *
1111 *-------------------------------------------------------------------------
1212 */
4040
4141int XLOGbuffers = 8 ;
4242XLogRecPtr MyLastRecPtr = {0 , 0 };
43- bool StopIfError = false ;
43+ uint32 StopIfError = 0 ;
4444bool InRecovery = false;
4545StartUpID ThisStartUpID = 0 ;
4646
@@ -270,6 +270,8 @@ XLogInsert(RmgrId rmid, uint8 info, char *hdr, uint32 hdrlen, char *buf, uint32
270270 return (RecPtr );
271271 }
272272
273+ START_CRIT_CODE ;
274+
273275 /* obtain xlog insert lock */
274276 if (TAS (& (XLogCtl -> insert_lck ))) /* busy */
275277 {
@@ -496,6 +498,7 @@ XLogInsert(RmgrId rmid, uint8 info, char *hdr, uint32 hdrlen, char *buf, uint32
496498 }
497499 }
498500
501+ END_CRIT_CODE ;
499502 return (RecPtr );
500503}
501504
@@ -523,6 +526,9 @@ XLogFlush(XLogRecPtr record)
523526 return ;
524527 if (XLByteLE (record , LgwrResult .Flush ))
525528 return ;
529+
530+ START_CRIT_CODE ;
531+
526532 WriteRqst = LgwrRqst .Write ;
527533 for (;;)
528534 {
@@ -533,6 +539,7 @@ XLogFlush(XLogRecPtr record)
533539 if (XLByteLE (record , LgwrResult .Flush ))
534540 {
535541 S_UNLOCK (& (XLogCtl -> info_lck ));
542+ END_CRIT_CODE ;
536543 return ;
537544 }
538545 if (XLByteLT (XLogCtl -> LgwrRqst .Flush , record ))
@@ -578,6 +585,7 @@ XLogFlush(XLogRecPtr record)
578585 if (XLByteLE (record , LgwrResult .Flush ))
579586 {
580587 S_UNLOCK (& (XLogCtl -> lgwr_lck ));
588+ END_CRIT_CODE ;
581589 return ;
582590 }
583591 if (XLByteLT (LgwrResult .Write , WriteRqst ))
@@ -587,6 +595,7 @@ XLogFlush(XLogRecPtr record)
587595 S_UNLOCK (& (XLogCtl -> lgwr_lck ));
588596 if (XLByteLT (LgwrResult .Flush , record ))
589597 elog (STOP , "XLogFlush: request is not satisfied" );
598+ END_CRIT_CODE ;
590599 return ;
591600 }
592601 break ;
@@ -632,6 +641,8 @@ XLogFlush(XLogRecPtr record)
632641 XLogCtl -> Write .LgwrResult = LgwrResult ;
633642
634643 S_UNLOCK (& (XLogCtl -> lgwr_lck ));
644+
645+ END_CRIT_CODE ;
635646 return ;
636647
637648}
@@ -1519,9 +1530,9 @@ StartupXLOG()
15191530 LastRec ;
15201531 XLogRecord * record ;
15211532 char buffer [MAXLOGRECSZ + SizeOfXLogRecord ];
1522- bool sie_saved = false;
15231533
15241534 elog (LOG , "starting up" );
1535+ StopIfError ++ ;
15251536
15261537 XLogCtl -> xlblocks = (XLogRecPtr * ) (((char * ) XLogCtl ) + sizeof (XLogCtlData ));
15271538 XLogCtl -> pages = ((char * ) XLogCtl -> xlblocks + sizeof (XLogRecPtr ) * XLOGbuffers );
@@ -1628,9 +1639,6 @@ StartupXLOG()
16281639 ControlFile -> time = time (NULL );
16291640 UpdateControlFile ();
16301641
1631- sie_saved = StopIfError ;
1632- StopIfError = true;
1633-
16341642 XLogOpenLogRelation (); /* open pg_log */
16351643 XLogInitRelationCache ();
16361644
@@ -1729,7 +1737,6 @@ StartupXLOG()
17291737 if (InRecovery )
17301738 {
17311739 CreateCheckPoint (true);
1732- StopIfError = sie_saved ;
17331740 XLogCloseRelationCache ();
17341741 }
17351742 InRecovery = false;
@@ -1742,6 +1749,7 @@ StartupXLOG()
17421749 XLogCtl -> ThisStartUpID = ThisStartUpID ;
17431750
17441751 elog (LOG , "database system is in production state" );
1752+ StopIfError -- ;
17451753
17461754 return ;
17471755}
@@ -1764,8 +1772,10 @@ ShutdownXLOG()
17641772{
17651773 elog (LOG , "shutting down" );
17661774
1775+ StopIfError ++ ;
17671776 CreateDummyCaches ();
17681777 CreateCheckPoint (true);
1778+ StopIfError -- ;
17691779
17701780 elog (LOG , "database system is shut down" );
17711781}
@@ -1787,6 +1797,7 @@ CreateCheckPoint(bool shutdown)
17871797 if (MyLastRecPtr .xrecoff != 0 )
17881798 elog (ERROR , "CreateCheckPoint: cannot be called inside transaction block" );
17891799
1800+ START_CRIT_CODE ;
17901801 while (TAS (& (XLogCtl -> chkp_lck )))
17911802 {
17921803 struct timeval delay = {2 , 0 };
@@ -1917,6 +1928,7 @@ CreateCheckPoint(bool shutdown)
19171928 S_UNLOCK (& (XLogCtl -> chkp_lck ));
19181929
19191930 MyLastRecPtr .xrecoff = 0 ; /* to avoid commit record */
1931+ END_CRIT_CODE ;
19201932
19211933 return ;
19221934}
0 commit comments