diff options
author | Hiroshi Inoue | 2000-07-31 01:16:24 +0000 |
---|---|---|
committer | Hiroshi Inoue | 2000-07-31 01:16:24 +0000 |
commit | b7319d371790c6103813ab1c6ac4646ba985c9d8 (patch) | |
tree | 90a75e5b60d0daf61e9c96191dea362be6dd8fce /src | |
parent | 8f9fa0e14320c5e2f2d0514e5b6c404ec7b54016 (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.c | 26 |
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)); |