summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHiroshi Inoue2000-07-31 01:16:24 +0000
committerHiroshi Inoue2000-07-31 01:16:24 +0000
commitb7319d371790c6103813ab1c6ac4646ba985c9d8 (patch)
tree90a75e5b60d0daf61e9c96191dea362be6dd8fce /src
parent8f9fa0e14320c5e2f2d0514e5b6c404ec7b54016 (diff)
Cancel request while waiting for a lock should try to wake
up sleeping processes.
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/lmgr/proc.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index de2b406f87c..01818e99fa7 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.76 2000/06/28 03:32:07 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.77 2000/07/31 01:16:24 inoue Exp $
*
*-------------------------------------------------------------------------
*/
@@ -47,7 +47,7 @@
* This is so that we can support more backends. (system-wide semaphore
* sets run out pretty fast.) -ay 4/95
*
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.76 2000/06/28 03:32:07 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.77 2000/07/31 01:16:24 inoue Exp $
*/
#include <sys/time.h>
#include <unistd.h>
@@ -322,18 +322,20 @@ GetOffWaitqueue(PROC *proc)
if (proc->links.next != INVALID_OFFSET)
{
int lockmode = proc->token;
+ LOCK *waitLock = proc->waitLock;
- Assert(proc->waitLock->waitProcs.size > 0);
+ Assert(waitLock);
+ Assert(waitLock->waitProcs.size > 0);
SHMQueueDelete(&(proc->links));
- --proc->waitLock->waitProcs.size;
- Assert(proc->waitLock->nHolding > 0);
- Assert(proc->waitLock->nHolding > proc->waitLock->nActive);
- --proc->waitLock->nHolding;
- Assert(proc->waitLock->holders[lockmode] > 0);
- --proc->waitLock->holders[lockmode];
- if (proc->waitLock->activeHolders[lockmode] ==
- proc->waitLock->holders[lockmode])
- proc->waitLock->waitMask &= ~(1 << lockmode);
+ --waitLock->waitProcs.size;
+ Assert(waitLock->nHolding > 0);
+ Assert(waitLock->nHolding > proc->waitLock->nActive);
+ --waitLock->nHolding;
+ Assert(waitLock->holders[lockmode] > 0);
+ --waitLock->holders[lockmode];
+ if (waitLock->activeHolders[lockmode] == waitLock->holders[lockmode])
+ waitLock->waitMask &= ~(1 << lockmode);
+ ProcLockWakeup(&(waitLock->waitProcs), LOCK_LOCKMETHOD(*waitLock), waitLock);
getoffed = true;
}
SHMQueueElemInit(&(proc->links));