If we're going to have a non-panic check for held_lwlocks[] overrun,
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Apr 2005 14:18:35 +0000 (14:18 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Apr 2005 14:18:35 +0000 (14:18 +0000)
it must occur *before* we get into the critical state of holding a
lock we have no place to record.  Per discussion with Qingqing Zhou.

src/backend/storage/lmgr/lwlock.c

index 438f4f4d3b585d0ce32fddf2705d96042e7569b8..9d80f3b8c507c28d897979f3e3e56ed4cacfdf83 100644 (file)
@@ -213,6 +213,10 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode)
         */
        Assert(!(proc == NULL && IsUnderPostmaster));
 
+       /* Ensure we will have room to remember the lock */
+       if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS)
+               elog(ERROR, "too many LWLocks taken");
+
        /*
         * Lock out cancel/die interrupts until we exit the code section
         * protected by the LWLock.  This ensures that interrupts will not
@@ -328,8 +332,6 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode)
        SpinLockRelease_NoHoldoff(&lock->mutex);
 
        /* Add lock to list of locks held by this backend */
-       if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS)
-               elog(ERROR, "too many LWLocks taken");
        held_lwlocks[num_held_lwlocks++] = lockid;
 
        /*
@@ -354,6 +356,10 @@ LWLockConditionalAcquire(LWLockId lockid, LWLockMode mode)
 
        PRINT_LWDEBUG("LWLockConditionalAcquire", lockid, lock);
 
+       /* Ensure we will have room to remember the lock */
+       if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS)
+               elog(ERROR, "too many LWLocks taken");
+
        /*
         * Lock out cancel/die interrupts until we exit the code section
         * protected by the LWLock.  This ensures that interrupts will not
@@ -398,8 +404,6 @@ LWLockConditionalAcquire(LWLockId lockid, LWLockMode mode)
        else
        {
                /* Add lock to list of locks held by this backend */
-               if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS)
-                       elog(ERROR, "too many LWLocks taken");
                held_lwlocks[num_held_lwlocks++] = lockid;
        }