]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Cancel request while waiting for a lock should try to wake
authorHiroshi Inoue <inoue@tpf.co.jp>
Wed, 20 Sep 2000 07:20:27 +0000 (07:20 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Wed, 20 Sep 2000 07:20:27 +0000 (07:20 +0000)
up sleeping processes.

src/backend/storage/lmgr/proc.c

index de161517239f68ce0ace6d873da2072b435fd8bc..dca8128d424947386ffcec0c36b0deb54402112c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.72 2000/04/12 17:15:38 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.72.2.1 2000/09/20 07:20:27 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.72 2000/04/12 17:15:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.72.2.1 2000/09/20 07:20:27 inoue Exp $
  */
 #include <sys/time.h>
 #include <unistd.h>
@@ -326,18 +326,20 @@ GetOffWaitqueue(PROC *proc)
        if (proc->links.next != INVALID_OFFSET)
        {
                int                     lockmode = proc->token;
+               LOCK    *waitLock = proc->waitLock;
 
-               Assert(proc->waitLock->waitProcs.size > 0);
+               Assert(waitLock);
+               Assert(waitLock->waitProcs.size > 0);
                SHMQueueDelete(&(proc->links));
-               --proc->waitLock->waitProcs.size;
-               Assert(proc->waitLock->nHolding > 0);
-               Assert(proc->waitLock->nHolding > proc->waitLock->nActive);
-               --proc->waitLock->nHolding;
-               Assert(proc->waitLock->holders[lockmode] > 0);
-               --proc->waitLock->holders[lockmode];
-               if (proc->waitLock->activeHolders[lockmode] ==
-                       proc->waitLock->holders[lockmode])
-                       proc->waitLock->waitMask &= ~(1 << lockmode);
+               --waitLock->waitProcs.size;
+               Assert(waitLock->nHolding > 0);
+               Assert(waitLock->nHolding > proc->waitLock->nActive);
+               --waitLock->nHolding;
+               Assert(waitLock->holders[lockmode] > 0);
+               --waitLock->holders[lockmode];
+               if (waitLock->activeHolders[lockmode] == waitLock->holders[lockmode])
+                       waitLock->waitMask &= ~(1 << lockmode);
+               ProcLockWakeup(&(waitLock->waitProcs), LOCK_LOCKMETHOD(*waitLock), waitLock);
                getoffed = true;
        }
        SHMQueueElemInit(&(proc->links));