Hi Amit, Thanks for the reply!
Yes, in LockAcquireExtended, after exiting WaitOnLock, there would be a read access to proclock, however, since the lock has either been granted or rejected by deadlock check, I can think of no possible concurrent write access to the proclock, so is it really necessary to acquire the LWLock? Thanks, Kenan On Fri, Dec 18, 2015 at 10:25 PM, Amit Kapila <amit.kapil...@gmail.com> wrote: > On Thu, Dec 17, 2015 at 1:51 PM, Kenan Yao <k...@pivotal.io> wrote: > >> Hi there, >> >> In function ProcSleep, after the process has been waken up, either with >> lock granted or deadlock detected, it would re-acquire the lock table's >> partition LWLock. >> >> The code episode is here: >> >> /* >> * Re-acquire the lock table's partition lock. We have to do this to >> hold >> * off cancel/die interrupts before we can mess with lockAwaited (else we >> * might have a missed or duplicated locallock update). >> */ >> LWLockAcquire(partitionLock, LW_EXCLUSIVE); >> >> /* >> * We no longer want LockErrorCleanup to do anything. >> */ >> lockAwaited = NULL; >> >> /* >> * If we got the lock, be sure to remember it in the locallock table. >> */ >> if (MyProc->waitStatus == STATUS_OK) >> GrantAwaitedLock(); >> >> /* >> * We don't have to do anything else, because the awaker did all the >> * necessary update of the lock table and MyProc. >> */ >> return MyProc->waitStatus; >> >> >> Questions are: >> >> (1) The comment says that "we might have a missed or duplicated locallock >> update", in what cases would we hit this if without holding the LWLock? >> >> (2) The comment says "we have to do this to hold off cancel/die >> interrupts", then: >> >> - why using LWLockAcquire instead of HOLD_INTERRUPTS directly? >> - From the handler of SIGINT and SIGTERM, seems nothing serious would >> be processed here, since no CHECK_FOR_INTERRUPS is called before releasing >> this LWLock. Why we should hold off cancel/die interrupts here? >> >> (3) Before releasing this LWLock, the only share memory access is >> MyProc->waitStatus; since the process has been granted the lock or removed >> from the lock's waiting list because of deadlock, is it possible some other >> processes would access this field? if not, then why we need LWLock here? >> what does this lock protect? >> >> > I think the other thing which needs protection of LWLock is > access to proclock which is done in the caller > (LockAcquireExtended). > > > > > With Regards, > Amit Kapila. > EnterpriseDB: http://www.enterprisedb.com >