Fix a variety of locking problems like newer lock waiters getting
authorBruce Momjian <bruce@momjian.us>
Fri, 23 Jan 1998 22:16:48 +0000 (22:16 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 23 Jan 1998 22:16:48 +0000 (22:16 +0000)
lock before older waiters, and having readlock people not share
locks if a writer is waiting for a lock, and waiting writers not
getting priority over waiting readers.

src/backend/storage/lmgr/lock.c
src/backend/storage/lmgr/proc.c

index 640c36e5d1a10c907e5c4942489961c0dd98fc7c..30078cbb16119776329a94efcabbd6b00ef44b6b 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.19 1998/01/23 06:01:03 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.20 1998/01/23 22:16:46 momjian Exp $
  *
  * NOTES
  *       Outside modules can create a lock table and acquire/release
@@ -708,6 +708,20 @@ LockResolveConflicts(LOCKTAB *ltable,
                result->nHolding = 0;
        }
 
+       {
+               /* ------------------------
+                * If someone with a greater priority is waiting for the lock,
+                * do not continue and share the lock, even if we can.  bjm
+                * ------------------------
+                */
+               int                             myprio = ltable->ctl->prio[lockt];
+               PROC_QUEUE              *waitQueue = &(lock->waitProcs);
+               PROC                    *topproc = (PROC *) MAKE_PTR(waitQueue->links.prev);
+
+               if (waitQueue->size && topproc->prio > myprio)
+                       return STATUS_FOUND;
+       }
+
        /* ----------------------------
         * first check for global conflicts: If no locks conflict
         * with mine, then I get the lock.
index 1df06815bff1544533b97801d83dd18a4d9104d5..b07b21d01db85aa6cfd48008d4b77349345815f5 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.26 1998/01/23 06:01:05 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.27 1998/01/23 22:16:48 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -46,7 +46,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.26 1998/01/23 06:01:05 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.27 1998/01/23 22:16:48 momjian Exp $
  */
 #include <sys/time.h>
 #include <unistd.h>
@@ -469,7 +469,7 @@ ProcSleep(PROC_QUEUE *queue,
        proc = (PROC *) MAKE_PTR(queue->links.prev);
        for (i = 0; i < queue->size; i++)
        {
-               if (proc->prio < prio)
+               if (proc->prio >= prio)
                        proc = (PROC *) MAKE_PTR(proc->links.prev);
                else
                        break;