mirror of
https://github.com/postgres/postgres.git
synced 2025-07-12 21:01:52 +03:00
Cancel request while waiting for a lock should try to wake
up sleeping processes.
This commit is contained in:
@ -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 @@
|
|||||||
* 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)
|
|||||||
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));
|
||||||
|
Reference in New Issue
Block a user