From badb83f9ec72687c27e8f983fbaefc26a8d1af31 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Apr 2005 14:18:35 +0000 Subject: [PATCH] If we're going to have a non-panic check for held_lwlocks[] overrun, 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 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 112690ae90..f75ccc869f 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -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; } -- 2.11.0