提交 b7319d37 编写于 作者: H Hiroshi Inoue

Cancel request while waiting for a lock should try to wake

up sleeping processes.
上级 8f9fa0e1
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 @@ ...@@ -47,7 +47,7 @@
* This is so that we can support more backends. (system-wide semaphore * This is so that we can support more backends. (system-wide semaphore
* sets run out pretty fast.) -ay 4/95 * 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 <sys/time.h>
#include <unistd.h> #include <unistd.h>
...@@ -322,18 +322,20 @@ GetOffWaitqueue(PROC *proc) ...@@ -322,18 +322,20 @@ GetOffWaitqueue(PROC *proc)
if (proc->links.next != INVALID_OFFSET) if (proc->links.next != INVALID_OFFSET)
{ {
int lockmode = proc->token; int lockmode = proc->token;
LOCK *waitLock = proc->waitLock;
Assert(proc->waitLock->waitProcs.size > 0); Assert(waitLock);
Assert(waitLock->waitProcs.size > 0);
SHMQueueDelete(&(proc->links)); SHMQueueDelete(&(proc->links));
--proc->waitLock->waitProcs.size; --waitLock->waitProcs.size;
Assert(proc->waitLock->nHolding > 0); Assert(waitLock->nHolding > 0);
Assert(proc->waitLock->nHolding > proc->waitLock->nActive); Assert(waitLock->nHolding > proc->waitLock->nActive);
--proc->waitLock->nHolding; --waitLock->nHolding;
Assert(proc->waitLock->holders[lockmode] > 0); Assert(waitLock->holders[lockmode] > 0);
--proc->waitLock->holders[lockmode]; --waitLock->holders[lockmode];
if (proc->waitLock->activeHolders[lockmode] == if (waitLock->activeHolders[lockmode] == waitLock->holders[lockmode])
proc->waitLock->holders[lockmode]) waitLock->waitMask &= ~(1 << lockmode);
proc->waitLock->waitMask &= ~(1 << lockmode); ProcLockWakeup(&(waitLock->waitProcs), LOCK_LOCKMETHOD(*waitLock), waitLock);
getoffed = true; getoffed = true;
} }
SHMQueueElemInit(&(proc->links)); SHMQueueElemInit(&(proc->links));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册