diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 4e377d6498c381f62fe2c5d5a12c2376d6a33c1a..5e169114c3e0c6b3830d3e0ad1d9edef0b997ea3 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.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 @@ * 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.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 #include @@ -481,10 +481,28 @@ ProcQueueInit(PROC_QUEUE *queue) } +/* + * Handling cancel request while waiting for lock + * + */ static bool lockWaiting = false; void SetWaitingForLock(bool waiting) { + if (waiting == lockWaiting) + return; 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) { @@ -610,7 +628,7 @@ ins:; timeval.it_value.tv_sec = \ (DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER); - lockWaiting = true; + SetWaitingForLock(true); do { MyProc->errType = NO_ERROR; /* reset flag after deadlock check */