*
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.139 2004/08/29 05:06:48 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.140 2004/09/12 18:30:50 tgl Exp $
  *
  * NOTES
  *       Outside modules can create a lock table and acquire/release
                                                                                HASH_ENTER, &found);
        if (!proclock)
        {
+               /* Ooops, not enough shmem for the proclock */
+               if (lock->nRequested == 0)
+               {
+                       /*
+                        * There are no other requestors of this lock, so garbage-collect
+                        * the lock object.  We *must* do this to avoid a permanent leak
+                        * of shared memory, because there won't be anything to cause
+                        * anyone to release the lock object later.
+                        */
+                       Assert(SHMQueueEmpty(&(lock->procLocks)));
+                       lock = (LOCK *) hash_search(LockMethodLockHash[lockmethodid],
+                                                                               (void *) &(lock->tag),
+                                                                               HASH_REMOVE, NULL);
+               }
                LWLockRelease(masterLock);
+               if (!lock)                              /* hash remove failed? */
+                       elog(WARNING, "lock table corrupted");
                ereport(ERROR,
                                (errcode(ERRCODE_OUT_OF_MEMORY),
                                 errmsg("out of shared memory"),
                        if (!lock)
                        {
                                LWLockRelease(masterLock);
-                               elog(WARNING, "cannot remove lock from HTAB");
+                               elog(WARNING, "lock table corrupted");
                                return FALSE;
                        }
                }