Check pending cancel request before waiting for lock
authorHiroshi Inoue
Thu, 24 Feb 2000 04:36:01 +0000 (04:36 +0000)
committerHiroshi Inoue
Thu, 24 Feb 2000 04:36:01 +0000 (04:36 +0000)
src/backend/storage/lmgr/proc.c

index 4e377d6498c381f62fe2c5d5a12c2376d6a33c1a..5e169114c3e0c6b3830d3e0ad1d9edef0b997ea3 100644 (file)
@@ -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 */