Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd3fc362

Browse files
committed
Ensure that all direct uses of spinlock-protected data structures use
'volatile' pointers to access those structures, so that optimizingcompilers will not decide to move the structure accesses outside of thespinlock-acquire-to-spinlock-release sequence. There are no known bugsin these uses at present, but based on bad experience with lwlock.c,it seems prudent to ensure that we protect these other uses too.Per pghackers discussion around 12-Dec. (Note: it should not benecessary to worry about structures protected by LWLocks, since theLWLock acquire and release operations are not inline macros.)
1 parent774490c commitd3fc362

File tree

3 files changed

+75
-42
lines changed

3 files changed

+75
-42
lines changed

‎src/backend/access/transam/xlog.c

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.84 2001/12/23 07:25:39 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.85 2001/12/28 18:16:41 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -617,10 +617,15 @@ begin:;
617617
START_CRIT_SECTION();
618618

619619
/* update LogwrtResult before doing cache fill check */
620-
SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
621-
LogwrtRqst=XLogCtl->LogwrtRqst;
622-
LogwrtResult=XLogCtl->LogwrtResult;
623-
SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
620+
{
621+
/* use volatile pointer to prevent code rearrangement */
622+
volatileXLogCtlData*xlogctl=XLogCtl;
623+
624+
SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
625+
LogwrtRqst=xlogctl->LogwrtRqst;
626+
LogwrtResult=xlogctl->LogwrtResult;
627+
SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
628+
}
624629

625630
/*
626631
* If cache is half filled then try to acquire write lock and do
@@ -838,16 +843,20 @@ begin:;
838843

839844
if (updrqst)
840845
{
841-
SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
846+
/* use volatile pointer to prevent code rearrangement */
847+
volatileXLogCtlData*xlogctl=XLogCtl;
848+
849+
SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
842850
/* advance global request to include new block(s) */
843-
if (XLByteLT(XLogCtl->LogwrtRqst.Write,WriteRqst))
844-
XLogCtl->LogwrtRqst.Write=WriteRqst;
851+
if (XLByteLT(xlogctl->LogwrtRqst.Write,WriteRqst))
852+
xlogctl->LogwrtRqst.Write=WriteRqst;
845853
/* update local result copy while I have the chance */
846-
LogwrtResult=XLogCtl->LogwrtResult;
847-
SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
854+
LogwrtResult=xlogctl->LogwrtResult;
855+
SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
848856
}
849857

850858
END_CRIT_SECTION();
859+
851860
return (RecPtr);
852861
}
853862

@@ -892,11 +901,16 @@ AdvanceXLInsertBuffer(void)
892901
FinishedPageRqstPtr=XLogCtl->xlblocks[Insert->curridx];
893902

894903
/* Before waiting, get info_lck and update LogwrtResult */
895-
SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
896-
if (XLByteLT(XLogCtl->LogwrtRqst.Write,FinishedPageRqstPtr))
897-
XLogCtl->LogwrtRqst.Write=FinishedPageRqstPtr;
898-
LogwrtResult=XLogCtl->LogwrtResult;
899-
SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
904+
{
905+
/* use volatile pointer to prevent code rearrangement */
906+
volatileXLogCtlData*xlogctl=XLogCtl;
907+
908+
SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
909+
if (XLByteLT(xlogctl->LogwrtRqst.Write,FinishedPageRqstPtr))
910+
xlogctl->LogwrtRqst.Write=FinishedPageRqstPtr;
911+
LogwrtResult=xlogctl->LogwrtResult;
912+
SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
913+
}
900914

901915
update_needed= false;/* Did the shared-request update */
902916

@@ -1149,13 +1163,18 @@ XLogWrite(XLogwrtRqst WriteRqst)
11491163
* 'result' values. This is not absolutely essential, but it saves
11501164
* some code in a couple of places.
11511165
*/
1152-
SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
1153-
XLogCtl->LogwrtResult=LogwrtResult;
1154-
if (XLByteLT(XLogCtl->LogwrtRqst.Write,LogwrtResult.Write))
1155-
XLogCtl->LogwrtRqst.Write=LogwrtResult.Write;
1156-
if (XLByteLT(XLogCtl->LogwrtRqst.Flush,LogwrtResult.Flush))
1157-
XLogCtl->LogwrtRqst.Flush=LogwrtResult.Flush;
1158-
SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
1166+
{
1167+
/* use volatile pointer to prevent code rearrangement */
1168+
volatileXLogCtlData*xlogctl=XLogCtl;
1169+
1170+
SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
1171+
xlogctl->LogwrtResult=LogwrtResult;
1172+
if (XLByteLT(xlogctl->LogwrtRqst.Write,LogwrtResult.Write))
1173+
xlogctl->LogwrtRqst.Write=LogwrtResult.Write;
1174+
if (XLByteLT(xlogctl->LogwrtRqst.Flush,LogwrtResult.Flush))
1175+
xlogctl->LogwrtRqst.Flush=LogwrtResult.Flush;
1176+
SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
1177+
}
11591178

11601179
Write->LogwrtResult=LogwrtResult;
11611180
}
@@ -1206,11 +1225,16 @@ XLogFlush(XLogRecPtr record)
12061225
WriteRqstPtr=record;
12071226

12081227
/* read LogwrtResult and update local state */
1209-
SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
1210-
if (XLByteLT(WriteRqstPtr,XLogCtl->LogwrtRqst.Write))
1211-
WriteRqstPtr=XLogCtl->LogwrtRqst.Write;
1212-
LogwrtResult=XLogCtl->LogwrtResult;
1213-
SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
1228+
{
1229+
/* use volatile pointer to prevent code rearrangement */
1230+
volatileXLogCtlData*xlogctl=XLogCtl;
1231+
1232+
SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
1233+
if (XLByteLT(WriteRqstPtr,xlogctl->LogwrtRqst.Write))
1234+
WriteRqstPtr=xlogctl->LogwrtRqst.Write;
1235+
LogwrtResult=xlogctl->LogwrtResult;
1236+
SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
1237+
}
12141238

12151239
/* done already? */
12161240
if (!XLByteLE(record,LogwrtResult.Flush))

‎src/backend/storage/ipc/shmem.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.62 2001/10/25 05:49:42 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.63 2001/12/28 18:16:43 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -132,21 +132,23 @@ ShmemAlloc(Size size)
132132
{
133133
uint32newFree;
134134
void*newSpace;
135+
/* use volatile pointer to prevent code rearrangement */
136+
volatilePGShmemHeader*shmemseghdr=ShmemSegHdr;
135137

136138
/*
137139
* ensure all space is adequately aligned.
138140
*/
139141
size=MAXALIGN(size);
140142

141-
Assert(ShmemSegHdr!=NULL);
143+
Assert(shmemseghdr!=NULL);
142144

143145
SpinLockAcquire(ShmemLock);
144146

145-
newFree=ShmemSegHdr->freeoffset+size;
146-
if (newFree <=ShmemSegHdr->totalsize)
147+
newFree=shmemseghdr->freeoffset+size;
148+
if (newFree <=shmemseghdr->totalsize)
147149
{
148-
newSpace= (void*)MAKE_PTR(ShmemSegHdr->freeoffset);
149-
ShmemSegHdr->freeoffset=newFree;
150+
newSpace= (void*)MAKE_PTR(shmemseghdr->freeoffset);
151+
shmemseghdr->freeoffset=newFree;
150152
}
151153
else
152154
newSpace=NULL;

‎src/backend/storage/lmgr/proc.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.116 2001/11/08 20:37:52 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.117 2001/12/28 18:16:43 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -203,12 +203,14 @@ void
203203
InitProcess(void)
204204
{
205205
SHMEM_OFFSETmyOffset;
206+
/* use volatile pointer to prevent code rearrangement */
207+
volatilePROC_HDR*procglobal=ProcGlobal;
206208

207209
/*
208210
* ProcGlobal should be set by a previous call to InitProcGlobal (if
209211
* we are a backend, we inherit this by fork() from the postmaster).
210212
*/
211-
if (ProcGlobal==NULL)
213+
if (procglobal==NULL)
212214
elog(STOP,"InitProcess: Proc Header uninitialized");
213215

214216
if (MyProc!=NULL)
@@ -219,12 +221,12 @@ InitProcess(void)
219221
*/
220222
SpinLockAcquire(ProcStructLock);
221223

222-
myOffset=ProcGlobal->freeProcs;
224+
myOffset=procglobal->freeProcs;
223225

224226
if (myOffset!=INVALID_OFFSET)
225227
{
226228
MyProc= (PROC*)MAKE_PTR(myOffset);
227-
ProcGlobal->freeProcs=MyProc->links.next;
229+
procglobal->freeProcs=MyProc->links.next;
228230
SpinLockRelease(ProcStructLock);
229231
}
230232
else
@@ -437,6 +439,9 @@ ProcReleaseLocks(bool isCommit)
437439
staticvoid
438440
ProcKill(void)
439441
{
442+
/* use volatile pointer to prevent code rearrangement */
443+
volatilePROC_HDR*procglobal=ProcGlobal;
444+
440445
Assert(MyProc!=NULL);
441446

442447
/* Release any LW locks I am holding */
@@ -463,8 +468,8 @@ ProcKill(void)
463468
ProcFreeSem(MyProc->sem.semId,MyProc->sem.semNum);
464469

465470
/* Add PROC struct to freelist so space can be recycled in future */
466-
MyProc->links.next=ProcGlobal->freeProcs;
467-
ProcGlobal->freeProcs=MAKE_OFFSET(MyProc);
471+
MyProc->links.next=procglobal->freeProcs;
472+
procglobal->freeProcs=MAKE_OFFSET(MyProc);
468473

469474
/* PROC struct isn't mine anymore */
470475
MyProc=NULL;
@@ -1044,10 +1049,12 @@ disable_sigalrm_interrupt(void)
10441049
staticvoid
10451050
ProcGetNewSemIdAndNum(IpcSemaphoreId*semId,int*semNum)
10461051
{
1047-
inti;
1048-
intsemMapEntries=ProcGlobal->semMapEntries;
1049-
SEM_MAP_ENTRY*procSemMap=ProcGlobal->procSemMap;
1052+
/* use volatile pointer to prevent code rearrangement */
1053+
volatilePROC_HDR*procglobal=ProcGlobal;
1054+
intsemMapEntries=procglobal->semMapEntries;
1055+
volatileSEM_MAP_ENTRY*procSemMap=procglobal->procSemMap;
10501056
int32fullmask= (1 <<PROC_NSEMS_PER_SET)-1;
1057+
inti;
10511058

10521059
SpinLockAcquire(ProcStructLock);
10531060

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp