Oops, I had managed to break query-cancel-while-waiting-for-lock.
authorTom Lane
Tue, 16 Jan 2001 20:59:34 +0000 (20:59 +0000)
committerTom Lane
Tue, 16 Jan 2001 20:59:34 +0000 (20:59 +0000)
src/backend/storage/lmgr/proc.c
src/backend/tcop/postgres.c
src/include/storage/proc.h

index a58b355ecf270fab08834f60f385b3aef88a09dd..bc461f0f86f369314f3bc74b5fc426be1b14b586 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.93 2001/01/16 06:11:34 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.94 2001/01/16 20:59:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -48,7 +48,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.93 2001/01/16 06:11:34 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.94 2001/01/16 20:59:34 tgl Exp $
  */
 #include "postgres.h"
 
@@ -353,16 +353,19 @@ RemoveFromWaitQueue(PROC *proc)
 /*
  * Cancel any pending wait for lock, when aborting a transaction.
  *
+ * Returns true if we had been waiting for a lock, else false.
+ *
  * (Normally, this would only happen if we accept a cancel/die
  * interrupt while waiting; but an elog(ERROR) while waiting is
  * within the realm of possibility, too.)
  */
-void
+bool
 LockWaitCancel(void)
 {
    /* Nothing to do if we weren't waiting for a lock */
    if (!waitingForLock)
-       return;
+       return false;
+
    waitingForLock = false;
 
    /* Turn off the deadlock timer, if it's still running (see ProcSleep) */
@@ -395,6 +398,12 @@ LockWaitCancel(void)
     * prematurely.
     */
    ZeroProcSemaphore(MyProc);
+
+   /*
+    * Return true even if we were kicked off the lock before we were
+    * able to remove ourselves.
+    */
+   return true;
 }
 
 
index ff2c0c283d28b6276a48c2c752fc6dc6d097b0e5..80a1032e9a99916a8042b1f69c6034c1461d3430 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.201 2001/01/14 05:08:16 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.202 2001/01/16 20:59:34 tgl Exp $
  *
  * NOTES
  *   this is the "main" module of the postgres backend and
@@ -940,11 +940,14 @@ die(SIGNAL_ARGS)
        InterruptPending = true;
        ProcDiePending = true;
        /*
-        * If we're waiting for input, service the interrupt immediately
+        * If it's safe to interrupt, and we're waiting for input or a lock,
+        * service the interrupt immediately
         */
        if (ImmediateInterruptOK && CritSectionCount == 0)
        {
            DisableNotifyInterrupt();
+           /* Make sure HandleDeadLock won't run while shutting down... */
+           LockWaitCancel();
            ProcessInterrupts();
        }
    }
@@ -967,8 +970,16 @@ QueryCancelHandler(SIGNAL_ARGS)
        InterruptPending = true;
        QueryCancelPending = true;
        /*
-        * No point in raising Cancel if we are waiting for input ...
+        * If it's safe to interrupt, and we're waiting for a lock,
+        * service the interrupt immediately.  No point in interrupting
+        * if we're waiting for input, however.
         */
+       if (ImmediateInterruptOK && CritSectionCount == 0 &&
+           LockWaitCancel())
+       {
+           DisableNotifyInterrupt();
+           ProcessInterrupts();
+       }
    }
 
    errno = save_errno;
@@ -1668,7 +1679,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
    if (!IsUnderPostmaster)
    {
        puts("\nPOSTGRES backend interactive interface ");
-       puts("$Revision: 1.201 $ $Date: 2001/01/14 05:08:16 $\n");
+       puts("$Revision: 1.202 $ $Date: 2001/01/16 20:59:34 $\n");
    }
 
    /*
index 1007013a9df0243d12a1451876e86f57ada64989..131c3397894f7e5a4f133b3b646041e3c692f093 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: proc.h,v 1.35 2001/01/16 06:11:34 tgl Exp $
+ * $Id: proc.h,v 1.36 2001/01/16 20:59:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -140,7 +140,7 @@ extern PROC *ProcWakeup(PROC *proc, int errType);
 extern int ProcLockWakeup(LOCKMETHOD lockmethod, LOCK *lock);
 extern void ProcAddLock(SHM_QUEUE *elem);
 extern void ProcReleaseSpins(PROC *proc);
-extern void LockWaitCancel(void);
+extern bool LockWaitCancel(void);
 extern void HandleDeadLock(SIGNAL_ARGS);
 
 #endif  /* PROC_H */