]> granicus.if.org Git - postgresql/commitdiff
Initialize myProcLocks queues just once, at postmaster startup.
authorRobert Haas <rhaas@postgresql.org>
Wed, 2 Nov 2011 02:44:54 +0000 (22:44 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 2 Nov 2011 02:44:54 +0000 (22:44 -0400)
In assert-enabled builds, we assert during the shutdown sequence that
the queues have been properly emptied, and during process startup that
we are inheriting empty queues.  In non-assert enabled builds, we just
save a few cycles.

src/backend/storage/lmgr/proc.c

index 22cb0b82837e70ad4cb6a98b1a0dcec33a1ba0cf..eda3a98a85b0ba14ed82aa1570fe758b895dfa37 100644 (file)
@@ -157,7 +157,8 @@ void
 InitProcGlobal(void)
 {
        PGPROC     *procs;
-       int                     i;
+       int                     i,
+                               j;
        bool            found;
        uint32          TotalProcs = MaxBackends + NUM_AUXILIARY_PROCS;
 
@@ -222,6 +223,10 @@ InitProcGlobal(void)
                        procs[i].links.next = (SHM_QUEUE *) ProcGlobal->autovacFreeProcs;
                        ProcGlobal->autovacFreeProcs = &procs[i];
                }
+
+               /* Initialize myProcLocks[] shared memory queues. */
+               for (j = 0; j < NUM_LOCK_PARTITIONS; j++)
+                       SHMQueueInit(&(procs[i].myProcLocks[j]));
        }
 
        /*
@@ -243,7 +248,6 @@ InitProcess(void)
 {
        /* use volatile pointer to prevent code rearrangement */
        volatile PROC_HDR *procglobal = ProcGlobal;
-       int                     i;
 
        /*
         * ProcGlobal should be set up already (if we are a backend, we inherit
@@ -303,8 +307,8 @@ InitProcess(void)
                MarkPostmasterChildActive();
 
        /*
-        * Initialize all fields of MyProc, except for the semaphore and latch,
-        * which were prepared for us by InitProcGlobal.
+        * Initialize all fields of MyProc, except for those previously initialized
+        * by InitProcGlobal.
         */
        SHMQueueElemInit(&(MyProc->links));
        MyProc->waitStatus = STATUS_OK;
@@ -326,8 +330,16 @@ InitProcess(void)
        MyProc->lwWaitLink = NULL;
        MyProc->waitLock = NULL;
        MyProc->waitProcLock = NULL;
-       for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
-               SHMQueueInit(&(MyProc->myProcLocks[i]));
+#ifdef USE_ASSERT_CHECKING
+       if (assert_enabled)
+       {
+               int i;
+
+               /* Last process should have released all locks. */
+               for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
+                       Assert(SHMQueueEmpty(&(MyProc->myProcLocks[i])));
+       }
+#endif
        MyProc->recoveryConflictPending = false;
 
        /* Initialize fields for sync rep */
@@ -408,7 +420,6 @@ InitAuxiliaryProcess(void)
 {
        PGPROC     *auxproc;
        int                     proctype;
-       int                     i;
 
        /*
         * ProcGlobal should be set up already (if we are a backend, we inherit
@@ -455,8 +466,8 @@ InitAuxiliaryProcess(void)
        SpinLockRelease(ProcStructLock);
 
        /*
-        * Initialize all fields of MyProc, except for the semaphore and latch,
-        * which were prepared for us by InitProcGlobal.
+        * Initialize all fields of MyProc, except for those previously initialized
+        * by InitProcGlobal.
         */
        SHMQueueElemInit(&(MyProc->links));
        MyProc->waitStatus = STATUS_OK;
@@ -473,8 +484,16 @@ InitAuxiliaryProcess(void)
        MyProc->lwWaitLink = NULL;
        MyProc->waitLock = NULL;
        MyProc->waitProcLock = NULL;
-       for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
-               SHMQueueInit(&(MyProc->myProcLocks[i]));
+#ifdef USE_ASSERT_CHECKING
+       if (assert_enabled)
+       {
+               int i;
+
+               /* Last process should have released all locks. */
+               for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
+                       Assert(SHMQueueEmpty(&(MyProc->myProcLocks[i])));
+       }
+#endif
 
        /*
         * Acquire ownership of the PGPROC's latch, so that we can use WaitLatch.
@@ -687,6 +706,17 @@ ProcKill(int code, Datum arg)
        /* Make sure we're out of the sync rep lists */
        SyncRepCleanupAtProcExit();
 
+#ifdef USE_ASSERT_CHECKING
+       if (assert_enabled)
+       {
+               int i;
+
+               /* Last process should have released all locks. */
+               for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
+                       Assert(SHMQueueEmpty(&(MyProc->myProcLocks[i])));
+       }
+#endif
+
        /*
         * Release any LW locks I am holding.  There really shouldn't be any, but
         * it's cheap to check again before we cut the knees off the LWLock