Commit f017d7ee authored by Hiroshi Inoue's avatar Hiroshi Inoue

Check pending cancel request before waiting for lock

parent a5e94458
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.69 2000/02/22 09:55:20 inoue Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.70 2000/02/24 04:36:01 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.69 2000/02/22 09:55:20 inoue Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.70 2000/02/24 04:36:01 inoue Exp $
*/ */
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
...@@ -481,10 +481,28 @@ ProcQueueInit(PROC_QUEUE *queue) ...@@ -481,10 +481,28 @@ ProcQueueInit(PROC_QUEUE *queue)
} }
/*
* Handling cancel request while waiting for lock
*
*/
static bool lockWaiting = false; static bool lockWaiting = false;
void SetWaitingForLock(bool waiting) void SetWaitingForLock(bool waiting)
{ {
if (waiting == lockWaiting)
return;
lockWaiting = waiting; lockWaiting = waiting;
if (lockWaiting)
{
Assert(MyProc->links.next != INVALID_OFFSET);
if (QueryCancel) /* cancel request pending */
{
if (GetOffWaitqueue(MyProc))
{
lockWaiting = false;
elog(ERROR, "Query cancel requested while waiting lock");
}
}
}
} }
void LockWaitCancel(void) void LockWaitCancel(void)
{ {
...@@ -610,7 +628,7 @@ ins:; ...@@ -610,7 +628,7 @@ ins:;
timeval.it_value.tv_sec = \ timeval.it_value.tv_sec = \
(DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER); (DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER);
lockWaiting = true; SetWaitingForLock(true);
do do
{ {
MyProc->errType = NO_ERROR; /* reset flag after deadlock check */ MyProc->errType = NO_ERROR; /* reset flag after deadlock check */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment