aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/lmgr/proc.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-12-28 18:16:43 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-12-28 18:16:43 +0000
commitd3fc362ec2ce1cf095950dddf24061915f836c22 (patch)
treebdfb59f8d948a808596f10fee40b8ba21cf0e469 /src/backend/storage/lmgr/proc.c
parent774490c3db9a10df0d00f6d0ee72cb99a5298259 (diff)
downloadpostgresql-d3fc362ec2ce1cf095950dddf24061915f836c22.tar.gz
postgresql-d3fc362ec2ce1cf095950dddf24061915f836c22.zip
Ensure that all direct uses of spinlock-protected data structures use
'volatile' pointers to access those structures, so that optimizing compilers will not decide to move the structure accesses outside of the spinlock-acquire-to-spinlock-release sequence. There are no known bugs in 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 be necessary to worry about structures protected by LWLocks, since the LWLock acquire and release operations are not inline macros.)
Diffstat (limited to 'src/backend/storage/lmgr/proc.c')
-rw-r--r--src/backend/storage/lmgr/proc.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index 5fa8f133e57..b1be68a881f 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.116 2001/11/08 20:37:52 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.117 2001/12/28 18:16:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -203,12 +203,14 @@ void
InitProcess(void)
{
SHMEM_OFFSET myOffset;
+ /* use volatile pointer to prevent code rearrangement */
+ volatile PROC_HDR *procglobal = ProcGlobal;
/*
* ProcGlobal should be set by a previous call to InitProcGlobal (if
* we are a backend, we inherit this by fork() from the postmaster).
*/
- if (ProcGlobal == NULL)
+ if (procglobal == NULL)
elog(STOP, "InitProcess: Proc Header uninitialized");
if (MyProc != NULL)
@@ -219,12 +221,12 @@ InitProcess(void)
*/
SpinLockAcquire(ProcStructLock);
- myOffset = ProcGlobal->freeProcs;
+ myOffset = procglobal->freeProcs;
if (myOffset != INVALID_OFFSET)
{
MyProc = (PROC *) MAKE_PTR(myOffset);
- ProcGlobal->freeProcs = MyProc->links.next;
+ procglobal->freeProcs = MyProc->links.next;
SpinLockRelease(ProcStructLock);
}
else
@@ -437,6 +439,9 @@ ProcReleaseLocks(bool isCommit)
static void
ProcKill(void)
{
+ /* use volatile pointer to prevent code rearrangement */
+ volatile PROC_HDR *procglobal = ProcGlobal;
+
Assert(MyProc != NULL);
/* Release any LW locks I am holding */
@@ -463,8 +468,8 @@ ProcKill(void)
ProcFreeSem(MyProc->sem.semId, MyProc->sem.semNum);
/* Add PROC struct to freelist so space can be recycled in future */
- MyProc->links.next = ProcGlobal->freeProcs;
- ProcGlobal->freeProcs = MAKE_OFFSET(MyProc);
+ MyProc->links.next = procglobal->freeProcs;
+ procglobal->freeProcs = MAKE_OFFSET(MyProc);
/* PROC struct isn't mine anymore */
MyProc = NULL;
@@ -1044,10 +1049,12 @@ disable_sigalrm_interrupt(void)
static void
ProcGetNewSemIdAndNum(IpcSemaphoreId *semId, int *semNum)
{
- int i;
- int semMapEntries = ProcGlobal->semMapEntries;
- SEM_MAP_ENTRY *procSemMap = ProcGlobal->procSemMap;
+ /* use volatile pointer to prevent code rearrangement */
+ volatile PROC_HDR *procglobal = ProcGlobal;
+ int semMapEntries = procglobal->semMapEntries;
+ volatile SEM_MAP_ENTRY *procSemMap = procglobal->procSemMap;
int32 fullmask = (1 << PROC_NSEMS_PER_SET) - 1;
+ int i;
SpinLockAcquire(ProcStructLock);