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.45 2000/12/28 13:00:08 vadim Exp $
9+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.46 2000/12/29 21:31:21 tgl Exp $
1010 *
1111 *-------------------------------------------------------------------------
1212 */
@@ -411,7 +411,7 @@ begin:;
411411 }
412412 }
413413 }
414- s_lock_sleep ( i ++ );
414+ S_LOCK_SLEEP ( & ( XLogCtl -> insert_lck ), i ++ );
415415 if (!TAS (& (XLogCtl -> insert_lck )))
416416 break ;
417417 }
@@ -599,17 +599,10 @@ begin:;
599599
600600 if (updrqst )
601601 {
602- for (;;)
603- {
604- if (!TAS (& (XLogCtl -> info_lck )))
605- {
606- if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrRqst .Write ))
607- XLogCtl -> LgwrRqst .Write = LgwrRqst .Write ;
608- S_UNLOCK (& (XLogCtl -> info_lck ));
609- break ;
610- }
611- s_lock_sleep (i ++ );
612- }
602+ S_LOCK (& (XLogCtl -> info_lck ));
603+ if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrRqst .Write ))
604+ XLogCtl -> LgwrRqst .Write = LgwrRqst .Write ;
605+ S_UNLOCK (& (XLogCtl -> info_lck ));
613606 }
614607
615608 END_CRIT_CODE ;
@@ -622,7 +615,7 @@ XLogFlush(XLogRecPtr record)
622615 XLogRecPtr WriteRqst ;
623616 char buffer [BLCKSZ ];
624617 char * usebuf = NULL ;
625- unsigned i = 0 ;
618+ unsigned spins = 0 ;
626619 bool force_lgwr = false;
627620
628621 if (XLOG_DEBUG )
@@ -715,7 +708,7 @@ XLogFlush(XLogRecPtr record)
715708 break ;
716709 }
717710 }
718- s_lock_sleep ( i ++ );
711+ S_LOCK_SLEEP ( & ( XLogCtl -> lgwr_lck ), spins ++ );
719712 }
720713
721714 if (logFile >= 0 && (LgwrResult .Write .xlogid != logId ||
@@ -740,18 +733,12 @@ XLogFlush(XLogRecPtr record)
740733 logId , logSeg );
741734 LgwrResult .Flush = LgwrResult .Write ;
742735
743- for (i = 0 ;;)
744- {
745- if (!TAS (& (XLogCtl -> info_lck )))
746- {
747- XLogCtl -> LgwrResult = LgwrResult ;
748- if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrResult .Write ))
749- XLogCtl -> LgwrRqst .Write = LgwrResult .Write ;
750- S_UNLOCK (& (XLogCtl -> info_lck ));
751- break ;
752- }
753- s_lock_sleep (i ++ );
754- }
736+ S_LOCK (& (XLogCtl -> info_lck ));
737+ XLogCtl -> LgwrResult = LgwrResult ;
738+ if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrResult .Write ))
739+ XLogCtl -> LgwrRqst .Write = LgwrResult .Write ;
740+ S_UNLOCK (& (XLogCtl -> info_lck ));
741+
755742 XLogCtl -> Write .LgwrResult = LgwrResult ;
756743
757744 S_UNLOCK (& (XLogCtl -> lgwr_lck ));
@@ -767,6 +754,7 @@ GetFreeXLBuffer()
767754 XLogCtlInsert * Insert = & XLogCtl -> Insert ;
768755 XLogCtlWrite * Write = & XLogCtl -> Write ;
769756 uint16 curridx = NextBufIdx (Insert -> curridx );
757+ unsigned spins = 0 ;
770758
771759 LgwrRqst .Write = XLogCtl -> xlblocks [Insert -> curridx ];
772760 for (;;)
@@ -809,9 +797,8 @@ GetFreeXLBuffer()
809797 InitXLBuffer (curridx );
810798 return ;
811799 }
800+ S_LOCK_SLEEP (& (XLogCtl -> lgwr_lck ), spins ++ );
812801 }
813-
814- return ;
815802}
816803
817804static void
@@ -820,7 +807,6 @@ XLogWrite(char *buffer)
820807 XLogCtlWrite * Write = & XLogCtl -> Write ;
821808 char * from ;
822809 uint32 wcnt = 0 ;
823- int i = 0 ;
824810 bool usexistent ;
825811
826812 for (; XLByteLT (LgwrResult .Write , LgwrRqst .Write );)
@@ -919,18 +905,12 @@ XLogWrite(char *buffer)
919905 LgwrResult .Flush = LgwrResult .Write ;
920906 }
921907
922- for (;;)
923- {
924- if (!TAS (& (XLogCtl -> info_lck )))
925- {
926- XLogCtl -> LgwrResult = LgwrResult ;
927- if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrResult .Write ))
928- XLogCtl -> LgwrRqst .Write = LgwrResult .Write ;
929- S_UNLOCK (& (XLogCtl -> info_lck ));
930- break ;
931- }
932- s_lock_sleep (i ++ );
933- }
908+ S_LOCK (& (XLogCtl -> info_lck ));
909+ XLogCtl -> LgwrResult = LgwrResult ;
910+ if (XLByteLT (XLogCtl -> LgwrRqst .Write , LgwrResult .Write ))
911+ XLogCtl -> LgwrRqst .Write = LgwrResult .Write ;
912+ S_UNLOCK (& (XLogCtl -> info_lck ));
913+
934914 Write -> LgwrResult = LgwrResult ;
935915}
936916
@@ -2062,18 +2042,17 @@ CreateCheckPoint(bool shutdown)
20622042 uint32 _logId ;
20632043 uint32 _logSeg ;
20642044 char archdir [MAXPGPATH ];
2045+ unsigned spins = 0 ;
20652046
20662047 if (MyLastRecPtr .xrecoff != 0 )
20672048 elog (ERROR , "CreateCheckPoint: cannot be called inside transaction block" );
20682049
20692050 START_CRIT_CODE ;
2051+
2052+ /* Grab lock, using larger than normal sleep between tries (1 sec) */
20702053 while (TAS (& (XLogCtl -> chkp_lck )))
20712054 {
2072- struct timeval delay = {2 , 0 };
2073-
2074- if (shutdown )
2075- elog (STOP , "Checkpoint lock is busy while data base is shutting down" );
2076- (void ) select (0 , NULL , NULL , NULL , & delay );
2055+ S_LOCK_SLEEP_INTERVAL (& (XLogCtl -> chkp_lck ), spins ++ , 1000000 );
20772056 }
20782057
20792058 memset (& checkPoint , 0 , sizeof (checkPoint ));
@@ -2087,14 +2066,7 @@ CreateCheckPoint(bool shutdown)
20872066 checkPoint .Shutdown = shutdown ;
20882067
20892068 /* Get REDO record ptr */
2090- while (TAS (& (XLogCtl -> insert_lck )))
2091- {
2092- struct timeval delay = {1 , 0 };
2093-
2094- if (shutdown )
2095- elog (STOP , "XLog insert lock is busy while data base is shutting down" );
2096- (void ) select (0 , NULL , NULL , NULL , & delay );
2097- }
2069+ S_LOCK (& (XLogCtl -> insert_lck ));
20982070 freespace = ((char * ) Insert -> currpage ) + BLCKSZ - Insert -> currpos ;
20992071 if (freespace < SizeOfXLogRecord )
21002072 {
0 commit comments