6
6
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
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 $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -411,7 +411,7 @@ begin:;
411
411
}
412
412
}
413
413
}
414
- s_lock_sleep ( i ++ );
414
+ S_LOCK_SLEEP ( & ( XLogCtl -> insert_lck ), i ++ );
415
415
if (!TAS (& (XLogCtl -> insert_lck )))
416
416
break ;
417
417
}
@@ -599,17 +599,10 @@ begin:;
599
599
600
600
if (updrqst )
601
601
{
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 ));
613
606
}
614
607
615
608
END_CRIT_CODE ;
@@ -622,7 +615,7 @@ XLogFlush(XLogRecPtr record)
622
615
XLogRecPtr WriteRqst ;
623
616
char buffer [BLCKSZ ];
624
617
char * usebuf = NULL ;
625
- unsigned i = 0 ;
618
+ unsigned spins = 0 ;
626
619
bool force_lgwr = false;
627
620
628
621
if (XLOG_DEBUG )
@@ -715,7 +708,7 @@ XLogFlush(XLogRecPtr record)
715
708
break ;
716
709
}
717
710
}
718
- s_lock_sleep ( i ++ );
711
+ S_LOCK_SLEEP ( & ( XLogCtl -> lgwr_lck ), spins ++ );
719
712
}
720
713
721
714
if (logFile >= 0 && (LgwrResult .Write .xlogid != logId ||
@@ -740,18 +733,12 @@ XLogFlush(XLogRecPtr record)
740
733
logId , logSeg );
741
734
LgwrResult .Flush = LgwrResult .Write ;
742
735
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
+
755
742
XLogCtl -> Write .LgwrResult = LgwrResult ;
756
743
757
744
S_UNLOCK (& (XLogCtl -> lgwr_lck ));
@@ -767,6 +754,7 @@ GetFreeXLBuffer()
767
754
XLogCtlInsert * Insert = & XLogCtl -> Insert ;
768
755
XLogCtlWrite * Write = & XLogCtl -> Write ;
769
756
uint16 curridx = NextBufIdx (Insert -> curridx );
757
+ unsigned spins = 0 ;
770
758
771
759
LgwrRqst .Write = XLogCtl -> xlblocks [Insert -> curridx ];
772
760
for (;;)
@@ -809,9 +797,8 @@ GetFreeXLBuffer()
809
797
InitXLBuffer (curridx );
810
798
return ;
811
799
}
800
+ S_LOCK_SLEEP (& (XLogCtl -> lgwr_lck ), spins ++ );
812
801
}
813
-
814
- return ;
815
802
}
816
803
817
804
static void
@@ -820,7 +807,6 @@ XLogWrite(char *buffer)
820
807
XLogCtlWrite * Write = & XLogCtl -> Write ;
821
808
char * from ;
822
809
uint32 wcnt = 0 ;
823
- int i = 0 ;
824
810
bool usexistent ;
825
811
826
812
for (; XLByteLT (LgwrResult .Write , LgwrRqst .Write );)
@@ -919,18 +905,12 @@ XLogWrite(char *buffer)
919
905
LgwrResult .Flush = LgwrResult .Write ;
920
906
}
921
907
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
+
934
914
Write -> LgwrResult = LgwrResult ;
935
915
}
936
916
@@ -2062,18 +2042,17 @@ CreateCheckPoint(bool shutdown)
2062
2042
uint32 _logId ;
2063
2043
uint32 _logSeg ;
2064
2044
char archdir [MAXPGPATH ];
2045
+ unsigned spins = 0 ;
2065
2046
2066
2047
if (MyLastRecPtr .xrecoff != 0 )
2067
2048
elog (ERROR , "CreateCheckPoint: cannot be called inside transaction block" );
2068
2049
2069
2050
START_CRIT_CODE ;
2051
+
2052
+ /* Grab lock, using larger than normal sleep between tries (1 sec) */
2070
2053
while (TAS (& (XLogCtl -> chkp_lck )))
2071
2054
{
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 );
2077
2056
}
2078
2057
2079
2058
memset (& checkPoint , 0 , sizeof (checkPoint ));
@@ -2087,14 +2066,7 @@ CreateCheckPoint(bool shutdown)
2087
2066
checkPoint .Shutdown = shutdown ;
2088
2067
2089
2068
/* 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 ));
2098
2070
freespace = ((char * ) Insert -> currpage ) + BLCKSZ - Insert -> currpos ;
2099
2071
if (freespace < SizeOfXLogRecord )
2100
2072
{
0 commit comments