OSDN Git Service

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 112690a..f75ccc8 100644 (file)
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/lmgr/lwlock.c,v 1.26 2005/04/08 03:43:54 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/lmgr/lwlock.c,v 1.27 2005/04/08 14:18:35 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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;
        }