From 4971c36b46c63c0b36a38df6a4b6ad9f303e4620 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Tue, 14 Oct 2014 10:01:00 +0300 Subject: [PATCH] Don't let protected variable access to be reordered after spinlock release. LWLockAcquireWithVar needs to set the protected variable while holding the spinlock. Need to use a volatile pointer to make sure it doesn't get reordered by the compiler. The other functions that accessed the protected variable already got this right. 9.4 only. Earlier releases didn't have this code, and in master, spinlock release acts as a compiler barrier. --- src/backend/storage/lmgr/lwlock.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 1607bc9e53..cee3f082de 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -482,6 +482,7 @@ static inline bool LWLockAcquireCommon(LWLock *l, LWLockMode mode, uint64 *valptr, uint64 val) { volatile LWLock *lock = l; + volatile uint64 *valp = valptr; PGPROC *proc = MyProc; bool retry = false; bool result = true; @@ -637,8 +638,8 @@ LWLockAcquireCommon(LWLock *l, LWLockMode mode, uint64 *valptr, uint64 val) } /* If there's a variable associated with this lock, initialize it */ - if (valptr) - *valptr = val; + if (valp) + *valp = val; /* We are done updating shared state of the lock itself. */ SpinLockRelease(&lock->mutex);