Cancel request while waiting for a lock should try to wake

up sleeping processes.
This commit is contained in:
Hiroshi Inoue 2000-09-20 07:20:27 +00:00
parent a455ca4812
commit 8e9ad61397

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.72 2000/04/12 17:15:38 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.72.2.1 2000/09/20 07:20:27 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.72 2000/04/12 17:15:38 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.72.2.1 2000/09/20 07:20:27 inoue Exp $
*/
#include <sys/time.h>
#include <unistd.h>
@ -326,18 +326,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));