Thread: Minor lmgr code cleanup

Minor lmgr code cleanup

From
Manfred Koizar
Date:
Try to reduce confusion about what is a lock method identifier, a lock
method control structure, or a table of control structures.

. Use type LOCKMASK where an int is not a counter.

. Get rid of INVALID_TABLEID, use INVALID_LOCKMETHOD instead.

. Use INVALID_LOCKMETHOD instead of (LOCKMETHOD) NULL, because
  LOCKMETHOD is not a pointer.

. Define and use macro LockMethodIsValid.

. Rename LOCKMETHOD to LOCKMETHODID.

. Remove global variable LongTermTableId in lmgr.c, because it is
  never used.

. Make LockTableId static in lmgr.c, because it is used nowhere else.
  Why not remove it and use DEFAULT_LOCKMETHOD?

. Rename the lock method control structure from LOCKMETHODTABLE to
  LockMethodData.  Introduce a pointer type named LockMethod.

. Remove elog(FATAL) after InitLockTable() call in
  CreateSharedMemoryAndSemaphores(), because if something goes wrong,
  there is elog(FATAL) in LockMethodTableInit(), and if this doesn't
  help, an elog(ERROR) in InitLockTable() is promoted to FATAL.

. Make InitLockTable() void, because its only caller does not use its
  return value any more.

. Rename variables in lock.c to avoid statements like
    LockMethodTable[NumLockMethods] = lockMethodTable;
    lockMethodTable = LockMethodTable[lockmethod];

. Change LOCKMETHODID type to uint16 to fit into struct LOCKTAG.

. Remove static variables BITS_OFF and BITS_ON from lock.c, because
  I agree to this doubt:
 * XXX is a fetch from a static array really faster than a shift?

======================
 All 93 tests passed.
======================

Servus
 Manfred
diff -ruN ../base/src/backend/storage/ipc/ipci.c src/backend/storage/ipc/ipci.c
--- ../base/src/backend/storage/ipc/ipci.c    2003-08-04 04:40:03.000000000 +0200
+++ src/backend/storage/ipc/ipci.c    2003-09-06 16:53:54.000000000 +0200
@@ -111,8 +111,7 @@
      * Set up lock manager
      */
     InitLocks();
-    if (InitLockTable(maxBackends) == INVALID_TABLEID)
-        elog(FATAL, "could not create the lock table");
+    InitLockTable(maxBackends);

     /*
      * Set up process table
diff -ruN ../base/src/backend/storage/lmgr/deadlock.c src/backend/storage/lmgr/deadlock.c
--- ../base/src/backend/storage/lmgr/deadlock.c    2003-08-08 23:42:00.000000000 +0200
+++ src/backend/storage/lmgr/deadlock.c    2003-09-06 22:25:46.000000000 +0200
@@ -428,7 +428,7 @@
     LOCK       *lock;
     PROCLOCK   *proclock;
     SHM_QUEUE  *lockHolders;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     PROC_QUEUE *waitQueue;
     int            queue_size;
     int            conflictMask;
diff -ruN ../base/src/backend/storage/lmgr/lmgr.c src/backend/storage/lmgr/lmgr.c
--- ../base/src/backend/storage/lmgr/lmgr.c    2003-08-18 00:41:12.000000000 +0200
+++ src/backend/storage/lmgr/lmgr.c    2003-09-06 18:10:48.000000000 +0200
@@ -65,26 +65,24 @@

 };

-LOCKMETHOD    LockTableId = (LOCKMETHOD) NULL;
-LOCKMETHOD    LongTermTableId = (LOCKMETHOD) NULL;
+static    LOCKMETHODID    LockTableId = INVALID_LOCKMETHOD;

 /*
  * Create the lock table described by LockConflicts
  */
-LOCKMETHOD
+void
 InitLockTable(int maxBackends)
 {
-    int            lockmethod;
+    LOCKMETHODID    LongTermTableId;

     /* number of lock modes is lengthof()-1 because of dummy zero */
-    lockmethod = LockMethodTableInit("LockTable",
-                                     LockConflicts,
-                                     lengthof(LockConflicts) - 1,
-                                     maxBackends);
-    LockTableId = lockmethod;
-
-    if (!(LockTableId))
+    LockTableId = LockMethodTableInit("LockTable",
+                                      LockConflicts,
+                                      lengthof(LockConflicts) - 1,
+                                      maxBackends);
+    if (!LockMethodIsValid(LockTableId))
         elog(ERROR, "could not initialize lock table");
+    Assert(LockTableId == DEFAULT_LOCKMETHOD);

 #ifdef USER_LOCKS

@@ -92,11 +90,10 @@
      * Allocate another tableId for long-term locks
      */
     LongTermTableId = LockMethodTableRename(LockTableId);
-    if (!(LongTermTableId))
+    if (!LockMethodIsValid(LongTermTableId))
         elog(ERROR, "could not rename long-term lock table");
+    Assert(LongTermTableId == USER_LOCKMETHOD);
 #endif
-
-    return LockTableId;
 }

 /*
diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
--- ../base/src/backend/storage/lmgr/lock.c    2003-08-18 00:41:12.000000000 +0200
+++ src/backend/storage/lmgr/lock.c    2003-09-06 23:01:05.000000000 +0200
@@ -46,7 +46,7 @@
 #define NLOCKENTS(maxBackends)    (max_locks_per_xact * (maxBackends))


-static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
+static int WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
            LOCK *lock, PROCLOCK *proclock);
 static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc,
                  int *myHolding);
@@ -150,19 +150,15 @@


 /*
- * These are to simplify/speed up some bit arithmetic.
- *
- * XXX is a fetch from a static array really faster than a shift?
- * Wouldn't bet on it...
+ * These are to simplify some bit arithmetic.
  */
-
-static LOCKMASK BITS_OFF[MAX_LOCKMODES];
-static LOCKMASK BITS_ON[MAX_LOCKMODES];
+#define BITS_ON(i) (1 << (i))
+#define BITS_OFF(i) ~(1 << (i))

 /*
- * map from lockmethod to the lock table structure
+ * map from lock method id to the lock table structure
  */
-static LOCKMETHODTABLE *LockMethodTable[MAX_LOCK_METHODS];
+static LockMethod LockMethods[MAX_LOCK_METHODS];

 static int    NumLockMethods;

@@ -173,28 +169,20 @@
 void
 InitLocks(void)
 {
-    int            i;
-    int            bit;
-
-    bit = 1;
-    for (i = 0; i < MAX_LOCKMODES; i++, bit <<= 1)
-    {
-        BITS_ON[i] = bit;
-        BITS_OFF[i] = ~bit;
-    }
+    /* NOP */
 }


 /*
  * Fetch the lock method table associated with a given lock
  */
-LOCKMETHODTABLE *
+LockMethod
 GetLocksMethodTable(LOCK *lock)
 {
-    LOCKMETHOD    lockmethod = LOCK_LOCKMETHOD(*lock);
+    LOCKMETHODID    lockmethodid = LOCK_LOCKMETHOD(*lock);

-    Assert(lockmethod > 0 && lockmethod < NumLockMethods);
-    return LockMethodTable[lockmethod];
+    Assert(0 < lockmethodid && lockmethodid < NumLockMethods);
+    return LockMethods[lockmethodid];
 }


@@ -205,7 +193,7 @@
  * Notes: just copying.  Should only be called once.
  */
 static void
-LockMethodInit(LOCKMETHODTABLE *lockMethodTable,
+LockMethodInit(LockMethod lockMethodTable,
                LOCKMASK *conflictsP,
                int numModes)
 {
@@ -226,13 +214,13 @@
  * by the postmaster are inherited by each backend, so they must be in
  * TopMemoryContext.
  */
-LOCKMETHOD
+LOCKMETHODID
 LockMethodTableInit(char *tabName,
                     LOCKMASK *conflictsP,
                     int numModes,
                     int maxBackends)
 {
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    newLockMethod;
     char       *shmemName;
     HASHCTL        info;
     int            hash_flags;
@@ -254,10 +242,10 @@

     /* each lock table has a header in shared memory */
     sprintf(shmemName, "%s (lock method table)", tabName);
-    lockMethodTable = (LOCKMETHODTABLE *)
-        ShmemInitStruct(shmemName, sizeof(LOCKMETHODTABLE), &found);
+    newLockMethod = (LockMethod)
+        ShmemInitStruct(shmemName, sizeof(LockMethodData), &found);

-    if (!lockMethodTable)
+    if (!newLockMethod)
         elog(FATAL, "could not initialize lock table \"%s\"", tabName);

     /*
@@ -275,15 +263,15 @@
      */
     if (!found)
     {
-        MemSet(lockMethodTable, 0, sizeof(LOCKMETHODTABLE));
-        lockMethodTable->masterLock = LockMgrLock;
-        lockMethodTable->lockmethod = NumLockMethods;
+        MemSet(newLockMethod, 0, sizeof(LockMethodData));
+        newLockMethod->masterLock = LockMgrLock;
+        newLockMethod->lockmethodid = NumLockMethods;
     }

     /*
      * other modules refer to the lock table by a lockmethod ID
      */
-    LockMethodTable[NumLockMethods] = lockMethodTable;
+    LockMethods[NumLockMethods] = newLockMethod;
     NumLockMethods++;
     Assert(NumLockMethods <= MAX_LOCK_METHODS);

@@ -297,15 +285,15 @@
     hash_flags = (HASH_ELEM | HASH_FUNCTION);

     sprintf(shmemName, "%s (lock hash)", tabName);
-    lockMethodTable->lockHash = ShmemInitHash(shmemName,
-                                              init_table_size,
-                                              max_table_size,
-                                              &info,
-                                              hash_flags);
+    newLockMethod->lockHash = ShmemInitHash(shmemName,
+                                            init_table_size,
+                                            max_table_size,
+                                            &info,
+                                            hash_flags);

-    if (!lockMethodTable->lockHash)
+    if (!newLockMethod->lockHash)
         elog(FATAL, "could not initialize lock table \"%s\"", tabName);
-    Assert(lockMethodTable->lockHash->hash == tag_hash);
+    Assert(newLockMethod->lockHash->hash == tag_hash);

     /*
      * allocate a hash table for PROCLOCK structs.    This is used to store
@@ -317,23 +305,23 @@
     hash_flags = (HASH_ELEM | HASH_FUNCTION);

     sprintf(shmemName, "%s (proclock hash)", tabName);
-    lockMethodTable->proclockHash = ShmemInitHash(shmemName,
-                                                  init_table_size,
-                                                  max_table_size,
-                                                  &info,
-                                                  hash_flags);
+    newLockMethod->proclockHash = ShmemInitHash(shmemName,
+                                                init_table_size,
+                                                max_table_size,
+                                                &info,
+                                                hash_flags);

-    if (!lockMethodTable->proclockHash)
+    if (!newLockMethod->proclockHash)
         elog(FATAL, "could not initialize lock table \"%s\"", tabName);

     /* init data structures */
-    LockMethodInit(lockMethodTable, conflictsP, numModes);
+    LockMethodInit(newLockMethod, conflictsP, numModes);

     LWLockRelease(LockMgrLock);

     pfree(shmemName);

-    return lockMethodTable->lockmethod;
+    return newLockMethod->lockmethodid;
 }

 /*
@@ -349,22 +337,22 @@
  *        short term and long term locks, yet store them all in one hashtable.
  */

-LOCKMETHOD
-LockMethodTableRename(LOCKMETHOD lockmethod)
+LOCKMETHODID
+LockMethodTableRename(LOCKMETHODID lockmethodid)
 {
-    LOCKMETHOD    newLockMethod;
+    LOCKMETHODID    newLockMethodId;

     if (NumLockMethods >= MAX_LOCK_METHODS)
         return INVALID_LOCKMETHOD;
-    if (LockMethodTable[lockmethod] == INVALID_LOCKMETHOD)
+    if (LockMethods[lockmethodid] == INVALID_LOCKMETHOD)
         return INVALID_LOCKMETHOD;

     /* other modules refer to the lock table by a lockmethod ID */
-    newLockMethod = NumLockMethods;
+    newLockMethodId = NumLockMethods;
     NumLockMethods++;

-    LockMethodTable[newLockMethod] = LockMethodTable[lockmethod];
-    return newLockMethod;
+    LockMethods[newLockMethodId] = LockMethods[lockmethodid];
+    return newLockMethodId;
 }

 /*
@@ -412,7 +400,7 @@
  *
  *                                        normal lock        user lock
  *
- *        lockmethod                        1                2
+ *        lockmethodid                    1                2
  *        tag.dbId                        database oid    database oid
  *        tag.relId                        rel oid or 0    0
  *        tag.objId                        block id        lock id2
@@ -429,7 +417,7 @@
  */

 bool
-LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode, bool dontWait)
 {
     PROCLOCK   *proclock;
@@ -438,25 +426,25 @@
     bool        found;
     LOCK       *lock;
     LWLockId    masterLock;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     int            status;
     int            myHolding[MAX_LOCKMODES];
     int            i;

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
+    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
         elog(LOG, "LockAcquire: user lock [%u] %s",
              locktag->objId.blkno, lock_mode_names[lockmode]);
 #endif

     /* ???????? This must be changed when short term locks will be used */
-    locktag->lockmethod = lockmethod;
+    locktag->lockmethodid = lockmethodid;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
     {
-        elog(WARNING, "bad lock table id: %d", lockmethod);
+        elog(WARNING, "bad lock table id: %d", lockmethodid);
         return FALSE;
     }

@@ -682,7 +670,7 @@
         /*
          * Sleep till someone wakes me up.
          */
-        status = WaitOnLock(lockmethod, lockmode, lock, proclock);
+        status = WaitOnLock(lockmethodid, lockmode, lock, proclock);

         /*
          * NOTE: do not do any material change of state between here and
@@ -729,7 +717,7 @@
  * known.  If NULL is passed then these values will be computed internally.
  */
 int
-LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
+LockCheckConflicts(LockMethod lockMethodTable,
                    LOCKMODE lockmode,
                    LOCK *lock,
                    PROCLOCK *proclock,
@@ -842,9 +830,9 @@
 {
     lock->nGranted++;
     lock->granted[lockmode]++;
-    lock->grantMask |= BITS_ON[lockmode];
+    lock->grantMask |= BITS_ON(lockmode);
     if (lock->granted[lockmode] == lock->requested[lockmode])
-        lock->waitMask &= BITS_OFF[lockmode];
+        lock->waitMask &= BITS_OFF(lockmode);
     LOCK_PRINT("GrantLock", lock, lockmode);
     Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
     Assert(lock->nGranted <= lock->nRequested);
@@ -862,14 +850,14 @@
  * The locktable's masterLock must be held at entry.
  */
 static int
-WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
+WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
            LOCK *lock, PROCLOCK *proclock)
 {
-    LOCKMETHODTABLE *lockMethodTable = LockMethodTable[lockmethod];
+    LockMethod    lockMethodTable = LockMethods[lockmethodid];
     char       *new_status,
                *old_status;

-    Assert(lockmethod < NumLockMethods);
+    Assert(lockmethodid < NumLockMethods);

     LOCK_PRINT("WaitOnLock: sleeping on lock", lock, lockmode);

@@ -957,7 +945,7 @@
     waitLock->requested[lockmode]--;
     /* don't forget to clear waitMask bit if appropriate */
     if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
-        waitLock->waitMask &= BITS_OFF[lockmode];
+        waitLock->waitMask &= BITS_OFF(lockmode);

     /* Clean up the proc's own state */
     proc->waitLock = NULL;
@@ -968,7 +956,7 @@
 }

 /*
- * LockRelease -- look up 'locktag' in lock table 'lockmethod' and
+ * LockRelease -- look up 'locktag' in lock table 'lockmethodid' and
  *        release one 'lockmode' lock on it.
  *
  * Side Effects: find any waiting processes that are now wakable,
@@ -978,27 +966,27 @@
  *        come along and request the lock.)
  */
 bool
-LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode)
 {
     LOCK       *lock;
     LWLockId    masterLock;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     PROCLOCK   *proclock;
     PROCLOCKTAG proclocktag;
     HTAB       *proclockTable;
     bool        wakeupNeeded = false;

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
+    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
         elog(LOG, "LockRelease: user lock tag [%u] %d", locktag->objId.blkno, lockmode);
 #endif

     /* ???????? This must be changed when short term locks will be used */
-    locktag->lockmethod = lockmethod;
+    locktag->lockmethodid = lockmethodid;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
     {
         elog(WARNING, "lockMethodTable is null in LockRelease");
@@ -1045,7 +1033,7 @@
     {
         LWLockRelease(masterLock);
 #ifdef USER_LOCKS
-        if (lockmethod == USER_LOCKMETHOD)
+        if (lockmethodid == USER_LOCKMETHOD)
             elog(WARNING, "no lock with this tag");
         else
 #endif
@@ -1083,7 +1071,7 @@
     if (lock->granted[lockmode] == 0)
     {
         /* change the conflict mask.  No more of this lock type. */
-        lock->grantMask &= BITS_OFF[lockmode];
+        lock->grantMask &= BITS_OFF(lockmode);
     }

     LOCK_PRINT("LockRelease: updated", lock, lockmode);
@@ -1173,29 +1161,29 @@
  * specified XID are released.
  */
 bool
-LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
+LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
                bool allxids, TransactionId xid)
 {
     SHM_QUEUE  *procHolders = &(proc->procHolders);
     PROCLOCK   *proclock;
     PROCLOCK   *nextHolder;
     LWLockId    masterLock;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     int            i,
                 numLockModes;
     LOCK       *lock;

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
+    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
         elog(LOG, "LockReleaseAll: lockmethod=%d, pid=%d",
-             lockmethod, proc->pid);
+             lockmethodid, proc->pid);
 #endif

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
     {
-        elog(WARNING, "bad lock method: %d", lockmethod);
+        elog(WARNING, "bad lock method: %d", lockmethodid);
         return FALSE;
     }

@@ -1220,7 +1208,7 @@
         lock = (LOCK *) MAKE_PTR(proclock->tag.lock);

         /* Ignore items that are not of the lockmethod to be removed */
-        if (LOCK_LOCKMETHOD(*lock) != lockmethod)
+        if (LOCK_LOCKMETHOD(*lock) != lockmethodid)
             goto next_item;

         /* If not allxids, ignore items that are of the wrong xid */
@@ -1249,7 +1237,7 @@
                     lock->granted[i] -= proclock->holding[i];
                     Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
                     if (lock->granted[i] == 0)
-                        lock->grantMask &= BITS_OFF[i];
+                        lock->grantMask &= BITS_OFF(i);

                     /*
                      * Read comments in LockRelease
@@ -1331,7 +1319,7 @@
     LWLockRelease(masterLock);

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
+    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
         elog(LOG, "LockReleaseAll done");
 #endif

@@ -1346,7 +1334,7 @@

     size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
     size += maxBackends * MAXALIGN(sizeof(PGPROC));        /* each MyProc */
-    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODTABLE));        /* each lockMethodTable */
+    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LockMethodData));        /* each lock method */

     /* lockHash table */
     size += hash_estimate_size(max_table_size, sizeof(LOCK));
@@ -1390,7 +1378,7 @@

     LWLockAcquire(LockMgrLock, LW_EXCLUSIVE);

-    proclockTable = LockMethodTable[DEFAULT_LOCKMETHOD]->proclockHash;
+    proclockTable = LockMethods[DEFAULT_LOCKMETHOD]->proclockHash;

     data->nelements = i = proclockTable->hctl->nentries;

@@ -1446,8 +1434,8 @@
     SHM_QUEUE  *procHolders;
     PROCLOCK   *proclock;
     LOCK       *lock;
-    int            lockmethod = DEFAULT_LOCKMETHOD;
-    LOCKMETHODTABLE *lockMethodTable;
+    int            lockmethodid = DEFAULT_LOCKMETHOD;
+    LockMethod    lockMethodTable;

     proc = MyProc;
     if (proc == NULL)
@@ -1455,8 +1443,8 @@

     procHolders = &proc->procHolders;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
         return;

@@ -1489,8 +1477,8 @@
     PGPROC       *proc;
     PROCLOCK   *proclock;
     LOCK       *lock;
-    int            lockmethod = DEFAULT_LOCKMETHOD;
-    LOCKMETHODTABLE *lockMethodTable;
+    int            lockmethodid = DEFAULT_LOCKMETHOD;
+    LockMethod    lockMethodTable;
     HTAB       *proclockTable;
     HASH_SEQ_STATUS status;

@@ -1498,8 +1486,8 @@
     if (proc == NULL)
         return;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
         return;

diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
--- ../base/src/backend/storage/lmgr/proc.c    2003-08-04 04:40:03.000000000 +0200
+++ src/backend/storage/lmgr/proc.c    2003-09-06 22:43:50.000000000 +0200
@@ -524,7 +524,7 @@
  * semaphore is normally zero, so when we try to acquire it, we sleep.
  */
 int
-ProcSleep(LOCKMETHODTABLE *lockMethodTable,
+ProcSleep(LockMethod lockMethodTable,
           LOCKMODE lockmode,
           LOCK *lock,
           PROCLOCK *proclock)
@@ -750,7 +750,7 @@
  *        for lock, waken any that are no longer blocked.
  */
 void
-ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock)
+ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
 {
     PROC_QUEUE *waitQueue = &(lock->waitProcs);
     int            queue_size = waitQueue->size;
diff -ruN ../base/src/include/storage/lmgr.h src/include/storage/lmgr.h
--- ../base/src/include/storage/lmgr.h    2003-08-04 04:40:14.000000000 +0200
+++ src/include/storage/lmgr.h    2003-09-06 18:02:43.000000000 +0200
@@ -40,10 +40,7 @@
  * so increase that if you want to add more modes.
  */

-extern LOCKMETHOD LockTableId;
-
-
-extern LOCKMETHOD InitLockTable(int maxBackends);
+extern void InitLockTable(int maxBackends);
 extern void RelationInitLockInfo(Relation relation);

 /* Lock a relation */
diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
--- ../base/src/include/storage/lock.h    2003-08-04 04:40:14.000000000 +0200
+++ src/include/storage/lock.h    2003-09-06 22:45:16.000000000 +0200
@@ -42,22 +42,20 @@


 typedef int LOCKMASK;
-
 typedef int LOCKMODE;
-typedef int LOCKMETHOD;
-
 /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
 #define MAX_LOCKMODES        10

+typedef uint16 LOCKMETHODID;
 /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
 #define MAX_LOCK_METHODS    3

-#define INVALID_TABLEID        0
-
-#define INVALID_LOCKMETHOD    INVALID_TABLEID
+#define INVALID_LOCKMETHOD    0
 #define DEFAULT_LOCKMETHOD    1
 #define USER_LOCKMETHOD        2

+#define LockMethodIsValid(lockmethodid) ((lockmethodid) != INVALID_LOCKMETHOD)
+
 /*
  * There is normally only one lock method, the default one.
  * If user locks are enabled, an additional lock method is present.
@@ -83,15 +81,16 @@
  * masterLock -- synchronizes access to the table
  *
  */
-typedef struct LOCKMETHODTABLE
+typedef struct LockMethodData
 {
-    HTAB       *lockHash;
-    HTAB       *proclockHash;
-    LOCKMETHOD    lockmethod;
-    int            numLockModes;
-    int            conflictTab[MAX_LOCKMODES];
-    LWLockId    masterLock;
-} LOCKMETHODTABLE;
+    HTAB           *lockHash;
+    HTAB           *proclockHash;
+    LOCKMETHODID    lockmethodid;
+    int                numLockModes;
+    LOCKMASK        conflictTab[MAX_LOCKMODES];
+    LWLockId        masterLock;
+} LockMethodData;
+typedef LockMethodData *LockMethod;


 /*
@@ -115,7 +114,7 @@
      */
     OffsetNumber offnum;

-    uint16        lockmethod;        /* needed by userlocks */
+    LOCKMETHODID lockmethodid;        /* needed by userlocks */
 } LOCKTAG;


@@ -139,8 +138,8 @@
     LOCKTAG        tag;            /* unique identifier of lockable object */

     /* data */
-    int            grantMask;        /* bitmask for lock types already granted */
-    int            waitMask;        /* bitmask for lock types awaited */
+    LOCKMASK    grantMask;        /* bitmask for lock types already granted */
+    LOCKMASK    waitMask;        /* bitmask for lock types awaited */
     SHM_QUEUE    lockHolders;    /* list of PROCLOCK objects assoc. with
                                  * lock */
     PROC_QUEUE    waitProcs;        /* list of PGPROC objects waiting on lock */
@@ -151,7 +150,7 @@
     int            nGranted;        /* total of granted[] array */
 } LOCK;

-#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethod)
+#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethodid)


 /*
@@ -204,7 +203,7 @@
 } PROCLOCK;

 #define PROCLOCK_LOCKMETHOD(proclock) \
-        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethod)
+        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethodid)

 /*
  * This struct holds information passed from lmgr internals to the lock
@@ -227,17 +226,17 @@
  * function prototypes
  */
 extern void InitLocks(void);
-extern LOCKMETHODTABLE *GetLocksMethodTable(LOCK *lock);
-extern LOCKMETHOD LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
+extern LockMethod GetLocksMethodTable(LOCK *lock);
+extern LOCKMETHODID LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
                     int numModes, int maxBackends);
-extern LOCKMETHOD LockMethodTableRename(LOCKMETHOD lockmethod);
-extern bool LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+extern LOCKMETHODID LockMethodTableRename(LOCKMETHODID lockmethodid);
+extern bool LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode, bool dontWait);
-extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+extern bool LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode);
-extern bool LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
+extern bool LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
                bool allxids, TransactionId xid);
-extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
+extern int LockCheckConflicts(LockMethod lockMethodTable,
                    LOCKMODE lockmode,
                    LOCK *lock, PROCLOCK *proclock, PGPROC *proc,
                    int *myHolding);
diff -ruN ../base/src/include/storage/proc.h src/include/storage/proc.h
--- ../base/src/include/storage/proc.h    2003-08-04 04:40:15.000000000 +0200
+++ src/include/storage/proc.h    2003-09-06 22:45:54.000000000 +0200
@@ -101,10 +101,10 @@
 extern void ProcReleaseLocks(bool isCommit);

 extern void ProcQueueInit(PROC_QUEUE *queue);
-extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
+extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode,
           LOCK *lock, PROCLOCK *proclock);
 extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
-extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
+extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
 extern bool LockWaitCancel(void);

 extern void ProcWaitForSignal(void);

Re: Minor lmgr code cleanup

From
Tom Lane
Date:
Manfred Koizar <mkoi-pg@aon.at> writes:
> [large patch]

Looks reasonable except

> +#define BITS_OFF(i) ~(1 << (i))

I'd put another pair of parens around that.  Also, it might be worth
moving into a header file.  There is at least one place in proc.c that
manipulates lock masks using explicit shifts, because BITS_ON/BITS_OFF
weren't visible outside lock.c.  It'd be good to fix it.

BTW, did you check that the code still compiles with LOCK_DEBUG enabled?
How about contrib/userlock?

            regards, tom lane

Re: Minor lmgr code cleanup

From
Manfred Koizar
Date:
On Sun, 07 Sep 2003 10:19:07 -0400, Tom Lane <tgl@sss.pgh.pa.us>
wrote:
>> +#define BITS_OFF(i) ~(1 << (i))
>
>I'd put another pair of parens around that.  Also, it might be worth
>moving into a header file.  There is at least one place in proc.c that
>manipulates lock masks using explicit shifts, because BITS_ON/BITS_OFF
>weren't visible outside lock.c.

Done.  Small patch attached, should be applied after the large patch.
Big fat all-in-one patch available on request.

>BTW, did you check that the code still compiles with LOCK_DEBUG enabled?

No, I didn't and it didn't. :-(  Corrected.

>How about contrib/userlock?

Unaffected by my changes, still works AFAICT.

Servus
 Manfred
diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
--- ../base/src/backend/storage/lmgr/lock.c    2003-09-06 23:01:05.000000000 +0200
+++ src/backend/storage/lmgr/lock.c    2003-09-07 07:53:16.000000000 +0200
@@ -111,7 +111,7 @@
              "req(%d,%d,%d,%d,%d,%d,%d)=%d "
              "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
              where, MAKE_OFFSET(lock),
-             lock->tag.lockmethod, lock->tag.relId, lock->tag.dbId,
+             lock->tag.lockmethodid, lock->tag.relId, lock->tag.dbId,
              lock->tag.objId.blkno, lock->grantMask,
              lock->requested[1], lock->requested[2], lock->requested[3],
              lock->requested[4], lock->requested[5], lock->requested[6],
@@ -150,12 +150,6 @@


 /*
- * These are to simplify some bit arithmetic.
- */
-#define BITS_ON(i) (1 << (i))
-#define BITS_OFF(i) ~(1 << (i))
-
-/*
  * map from lock method id to the lock table structure
  */
 static LockMethod LockMethods[MAX_LOCK_METHODS];
@@ -654,15 +648,12 @@
          * Construct bitmask of locks this process holds on this object.
          */
         {
-            int            heldLocks = 0;
-            int            tmpMask;
+            LOCKMASK        heldLocks = 0;

-            for (i = 1, tmpMask = 2;
-                 i <= lockMethodTable->numLockModes;
-                 i++, tmpMask <<= 1)
+            for (i = 1; i <= lockMethodTable->numLockModes; i++)
             {
                 if (myHolding[i] > 0)
-                    heldLocks |= tmpMask;
+                    heldLocks |= LOCKBIT_ON(i);
             }
             MyProc->heldLocks = heldLocks;
         }
@@ -725,9 +716,8 @@
                    int *myHolding)        /* myHolding[] array or NULL */
 {
     int            numLockModes = lockMethodTable->numLockModes;
-    int            bitmask;
-    int            i,
-                tmpMask;
+    LOCKMASK    bitmask;
+    int            i;
     int            localHolding[MAX_LOCKMODES];

     /*
@@ -760,11 +750,10 @@

     /* Compute mask of lock types held by other processes */
     bitmask = 0;
-    tmpMask = 2;
-    for (i = 1; i <= numLockModes; i++, tmpMask <<= 1)
+    for (i = 1; i <= numLockModes; i++)
     {
         if (lock->granted[i] != myHolding[i])
-            bitmask |= tmpMask;
+            bitmask |= LOCKBIT_ON(i);
     }

     /*
@@ -830,9 +819,9 @@
 {
     lock->nGranted++;
     lock->granted[lockmode]++;
-    lock->grantMask |= BITS_ON(lockmode);
+    lock->grantMask |= LOCKBIT_ON(lockmode);
     if (lock->granted[lockmode] == lock->requested[lockmode])
-        lock->waitMask &= BITS_OFF(lockmode);
+        lock->waitMask &= LOCKBIT_OFF(lockmode);
     LOCK_PRINT("GrantLock", lock, lockmode);
     Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
     Assert(lock->nGranted <= lock->nRequested);
@@ -945,7 +934,7 @@
     waitLock->requested[lockmode]--;
     /* don't forget to clear waitMask bit if appropriate */
     if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
-        waitLock->waitMask &= BITS_OFF(lockmode);
+        waitLock->waitMask &= LOCKBIT_OFF(lockmode);

     /* Clean up the proc's own state */
     proc->waitLock = NULL;
@@ -1071,7 +1060,7 @@
     if (lock->granted[lockmode] == 0)
     {
         /* change the conflict mask.  No more of this lock type. */
-        lock->grantMask &= BITS_OFF(lockmode);
+        lock->grantMask &= LOCKBIT_OFF(lockmode);
     }

     LOCK_PRINT("LockRelease: updated", lock, lockmode);
@@ -1237,7 +1226,7 @@
                     lock->granted[i] -= proclock->holding[i];
                     Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
                     if (lock->granted[i] == 0)
-                        lock->grantMask &= BITS_OFF(i);
+                        lock->grantMask &= LOCKBIT_OFF(i);

                     /*
                      * Read comments in LockRelease
diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
--- ../base/src/backend/storage/lmgr/proc.c    2003-09-06 22:43:50.000000000 +0200
+++ src/backend/storage/lmgr/proc.c    2003-09-07 07:35:06.000000000 +0200
@@ -531,7 +531,7 @@
 {
     LWLockId    masterLock = lockMethodTable->masterLock;
     PROC_QUEUE *waitQueue = &(lock->waitProcs);
-    int            myHeldLocks = MyProc->heldLocks;
+    LOCKMASK    myHeldLocks = MyProc->heldLocks;
     bool        early_deadlock = false;
     PGPROC       *proc;
     int            i;
@@ -556,7 +556,7 @@
      */
     if (myHeldLocks != 0)
     {
-        int            aheadRequests = 0;
+        LOCKMASK    aheadRequests = 0;

         proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
         for (i = 0; i < waitQueue->size; i++)
@@ -596,7 +596,7 @@
                 break;
             }
             /* Nope, so advance to next waiter */
-            aheadRequests |= (1 << proc->waitLockMode);
+            aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
             proc = (PGPROC *) MAKE_PTR(proc->links.next);
         }

@@ -618,7 +618,7 @@
     SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
     waitQueue->size++;

-    lock->waitMask |= (1 << lockmode);
+    lock->waitMask |= LOCKBIT_ON(lockmode);

     /* Set up wait information in PGPROC object, too */
     MyProc->waitLock = lock;
@@ -755,7 +755,7 @@
     PROC_QUEUE *waitQueue = &(lock->waitProcs);
     int            queue_size = waitQueue->size;
     PGPROC       *proc;
-    int            aheadRequests = 0;
+    LOCKMASK    aheadRequests = 0;

     Assert(queue_size >= 0);

@@ -796,7 +796,7 @@
              * Cannot wake this guy. Remember his request for later
              * checks.
              */
-            aheadRequests |= (1 << lockmode);
+            aheadRequests |= LOCKBIT_ON(lockmode);
             proc = (PGPROC *) MAKE_PTR(proc->links.next);
         }
     }
diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
--- ../base/src/include/storage/lock.h    2003-09-06 22:45:16.000000000 +0200
+++ src/include/storage/lock.h    2003-09-07 07:25:13.000000000 +0200
@@ -46,6 +46,9 @@
 /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
 #define MAX_LOCKMODES        10

+#define LOCKBIT_ON(lockmode) (1 << (lockmode))
+#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
+
 typedef uint16 LOCKMETHODID;
 /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
 #define MAX_LOCK_METHODS    3

Re: Minor lmgr code cleanup

From
Tom Lane
Date:
Manfred Koizar <mkoi-pg@aon.at> writes:
>> I'd put another pair of parens around that. [etc]

> Done.  Small patch attached, should be applied after the large patch.
> Big fat all-in-one patch available on request.

Looks good to me.  Bruce, please add to pending queue for 7.5?

            regards, tom lane

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
This has been saved for the 7.5 release:

    http:/momjian.postgresql.org/cgi-bin/pgpatches2

---------------------------------------------------------------------------

Manfred Koizar wrote:
> On Sun, 07 Sep 2003 10:19:07 -0400, Tom Lane <tgl@sss.pgh.pa.us>
> wrote:
> >> +#define BITS_OFF(i) ~(1 << (i))
> >
> >I'd put another pair of parens around that.  Also, it might be worth
> >moving into a header file.  There is at least one place in proc.c that
> >manipulates lock masks using explicit shifts, because BITS_ON/BITS_OFF
> >weren't visible outside lock.c.
>
> Done.  Small patch attached, should be applied after the large patch.
> Big fat all-in-one patch available on request.
>
> >BTW, did you check that the code still compiles with LOCK_DEBUG enabled?
>
> No, I didn't and it didn't. :-(  Corrected.
>
> >How about contrib/userlock?
>
> Unaffected by my changes, still works AFAICT.
>
> Servus
>  Manfred

> diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
> --- ../base/src/backend/storage/lmgr/lock.c    2003-09-06 23:01:05.000000000 +0200
> +++ src/backend/storage/lmgr/lock.c    2003-09-07 07:53:16.000000000 +0200
> @@ -111,7 +111,7 @@
>               "req(%d,%d,%d,%d,%d,%d,%d)=%d "
>               "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
>               where, MAKE_OFFSET(lock),
> -             lock->tag.lockmethod, lock->tag.relId, lock->tag.dbId,
> +             lock->tag.lockmethodid, lock->tag.relId, lock->tag.dbId,
>               lock->tag.objId.blkno, lock->grantMask,
>               lock->requested[1], lock->requested[2], lock->requested[3],
>               lock->requested[4], lock->requested[5], lock->requested[6],
> @@ -150,12 +150,6 @@
>
>
>  /*
> - * These are to simplify some bit arithmetic.
> - */
> -#define BITS_ON(i) (1 << (i))
> -#define BITS_OFF(i) ~(1 << (i))
> -
> -/*
>   * map from lock method id to the lock table structure
>   */
>  static LockMethod LockMethods[MAX_LOCK_METHODS];
> @@ -654,15 +648,12 @@
>           * Construct bitmask of locks this process holds on this object.
>           */
>          {
> -            int            heldLocks = 0;
> -            int            tmpMask;
> +            LOCKMASK        heldLocks = 0;
>
> -            for (i = 1, tmpMask = 2;
> -                 i <= lockMethodTable->numLockModes;
> -                 i++, tmpMask <<= 1)
> +            for (i = 1; i <= lockMethodTable->numLockModes; i++)
>              {
>                  if (myHolding[i] > 0)
> -                    heldLocks |= tmpMask;
> +                    heldLocks |= LOCKBIT_ON(i);
>              }
>              MyProc->heldLocks = heldLocks;
>          }
> @@ -725,9 +716,8 @@
>                     int *myHolding)        /* myHolding[] array or NULL */
>  {
>      int            numLockModes = lockMethodTable->numLockModes;
> -    int            bitmask;
> -    int            i,
> -                tmpMask;
> +    LOCKMASK    bitmask;
> +    int            i;
>      int            localHolding[MAX_LOCKMODES];
>
>      /*
> @@ -760,11 +750,10 @@
>
>      /* Compute mask of lock types held by other processes */
>      bitmask = 0;
> -    tmpMask = 2;
> -    for (i = 1; i <= numLockModes; i++, tmpMask <<= 1)
> +    for (i = 1; i <= numLockModes; i++)
>      {
>          if (lock->granted[i] != myHolding[i])
> -            bitmask |= tmpMask;
> +            bitmask |= LOCKBIT_ON(i);
>      }
>
>      /*
> @@ -830,9 +819,9 @@
>  {
>      lock->nGranted++;
>      lock->granted[lockmode]++;
> -    lock->grantMask |= BITS_ON(lockmode);
> +    lock->grantMask |= LOCKBIT_ON(lockmode);
>      if (lock->granted[lockmode] == lock->requested[lockmode])
> -        lock->waitMask &= BITS_OFF(lockmode);
> +        lock->waitMask &= LOCKBIT_OFF(lockmode);
>      LOCK_PRINT("GrantLock", lock, lockmode);
>      Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
>      Assert(lock->nGranted <= lock->nRequested);
> @@ -945,7 +934,7 @@
>      waitLock->requested[lockmode]--;
>      /* don't forget to clear waitMask bit if appropriate */
>      if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
> -        waitLock->waitMask &= BITS_OFF(lockmode);
> +        waitLock->waitMask &= LOCKBIT_OFF(lockmode);
>
>      /* Clean up the proc's own state */
>      proc->waitLock = NULL;
> @@ -1071,7 +1060,7 @@
>      if (lock->granted[lockmode] == 0)
>      {
>          /* change the conflict mask.  No more of this lock type. */
> -        lock->grantMask &= BITS_OFF(lockmode);
> +        lock->grantMask &= LOCKBIT_OFF(lockmode);
>      }
>
>      LOCK_PRINT("LockRelease: updated", lock, lockmode);
> @@ -1237,7 +1226,7 @@
>                      lock->granted[i] -= proclock->holding[i];
>                      Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
>                      if (lock->granted[i] == 0)
> -                        lock->grantMask &= BITS_OFF(i);
> +                        lock->grantMask &= LOCKBIT_OFF(i);
>
>                      /*
>                       * Read comments in LockRelease
> diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
> --- ../base/src/backend/storage/lmgr/proc.c    2003-09-06 22:43:50.000000000 +0200
> +++ src/backend/storage/lmgr/proc.c    2003-09-07 07:35:06.000000000 +0200
> @@ -531,7 +531,7 @@
>  {
>      LWLockId    masterLock = lockMethodTable->masterLock;
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
> -    int            myHeldLocks = MyProc->heldLocks;
> +    LOCKMASK    myHeldLocks = MyProc->heldLocks;
>      bool        early_deadlock = false;
>      PGPROC       *proc;
>      int            i;
> @@ -556,7 +556,7 @@
>       */
>      if (myHeldLocks != 0)
>      {
> -        int            aheadRequests = 0;
> +        LOCKMASK    aheadRequests = 0;
>
>          proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
>          for (i = 0; i < waitQueue->size; i++)
> @@ -596,7 +596,7 @@
>                  break;
>              }
>              /* Nope, so advance to next waiter */
> -            aheadRequests |= (1 << proc->waitLockMode);
> +            aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>
> @@ -618,7 +618,7 @@
>      SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
>      waitQueue->size++;
>
> -    lock->waitMask |= (1 << lockmode);
> +    lock->waitMask |= LOCKBIT_ON(lockmode);
>
>      /* Set up wait information in PGPROC object, too */
>      MyProc->waitLock = lock;
> @@ -755,7 +755,7 @@
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
>      int            queue_size = waitQueue->size;
>      PGPROC       *proc;
> -    int            aheadRequests = 0;
> +    LOCKMASK    aheadRequests = 0;
>
>      Assert(queue_size >= 0);
>
> @@ -796,7 +796,7 @@
>               * Cannot wake this guy. Remember his request for later
>               * checks.
>               */
> -            aheadRequests |= (1 << lockmode);
> +            aheadRequests |= LOCKBIT_ON(lockmode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>      }
> diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
> --- ../base/src/include/storage/lock.h    2003-09-06 22:45:16.000000000 +0200
> +++ src/include/storage/lock.h    2003-09-07 07:25:13.000000000 +0200
> @@ -46,6 +46,9 @@
>  /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
>  #define MAX_LOCKMODES        10
>
> +#define LOCKBIT_ON(lockmode) (1 << (lockmode))
> +#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
> +
>  typedef uint16 LOCKMETHODID;
>  /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
>  #define MAX_LOCK_METHODS    3

>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
Tom Lane wrote:
> Manfred Koizar <mkoi-pg@aon.at> writes:
> >> I'd put another pair of parens around that. [etc]
>
> > Done.  Small patch attached, should be applied after the large patch.
> > Big fat all-in-one patch available on request.
>
> Looks good to me.  Bruce, please add to pending queue for 7.5?

Done.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> This has been saved for the 7.5 release:
>     http:/momjian.postgresql.org/cgi-bin/pgpatches2

BTW, that page still calls itself "PostgreSQL Items For 7.4."

            regards, tom lane

Re: Minor lmgr code cleanup

From
Manfred Koizar
Date:
On Mon, 8 Sep 2003 00:51:45 -0400 (EDT), Bruce Momjian
<pgman@candle.pha.pa.us> wrote:
>
>This has been saved for the 7.5 release:
>
>    http:/momjian.postgresql.org/cgi-bin/pgpatches2

Here is the combined patch.  Prior patches in this thread are hereby
obsolete.

Servus
 Manfred
diff -ruN ../base/src/backend/storage/ipc/ipci.c src/backend/storage/ipc/ipci.c
--- ../base/src/backend/storage/ipc/ipci.c    2003-08-04 04:40:03.000000000 +0200
+++ src/backend/storage/ipc/ipci.c    2003-09-06 16:53:54.000000000 +0200
@@ -111,8 +111,7 @@
      * Set up lock manager
      */
     InitLocks();
-    if (InitLockTable(maxBackends) == INVALID_TABLEID)
-        elog(FATAL, "could not create the lock table");
+    InitLockTable(maxBackends);

     /*
      * Set up process table
diff -ruN ../base/src/backend/storage/lmgr/deadlock.c src/backend/storage/lmgr/deadlock.c
--- ../base/src/backend/storage/lmgr/deadlock.c    2003-08-08 23:42:00.000000000 +0200
+++ src/backend/storage/lmgr/deadlock.c    2003-09-06 22:25:46.000000000 +0200
@@ -428,7 +428,7 @@
     LOCK       *lock;
     PROCLOCK   *proclock;
     SHM_QUEUE  *lockHolders;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     PROC_QUEUE *waitQueue;
     int            queue_size;
     int            conflictMask;
diff -ruN ../base/src/backend/storage/lmgr/lmgr.c src/backend/storage/lmgr/lmgr.c
--- ../base/src/backend/storage/lmgr/lmgr.c    2003-08-18 00:41:12.000000000 +0200
+++ src/backend/storage/lmgr/lmgr.c    2003-09-06 18:10:48.000000000 +0200
@@ -65,26 +65,24 @@

 };

-LOCKMETHOD    LockTableId = (LOCKMETHOD) NULL;
-LOCKMETHOD    LongTermTableId = (LOCKMETHOD) NULL;
+static    LOCKMETHODID    LockTableId = INVALID_LOCKMETHOD;

 /*
  * Create the lock table described by LockConflicts
  */
-LOCKMETHOD
+void
 InitLockTable(int maxBackends)
 {
-    int            lockmethod;
+    LOCKMETHODID    LongTermTableId;

     /* number of lock modes is lengthof()-1 because of dummy zero */
-    lockmethod = LockMethodTableInit("LockTable",
-                                     LockConflicts,
-                                     lengthof(LockConflicts) - 1,
-                                     maxBackends);
-    LockTableId = lockmethod;
-
-    if (!(LockTableId))
+    LockTableId = LockMethodTableInit("LockTable",
+                                      LockConflicts,
+                                      lengthof(LockConflicts) - 1,
+                                      maxBackends);
+    if (!LockMethodIsValid(LockTableId))
         elog(ERROR, "could not initialize lock table");
+    Assert(LockTableId == DEFAULT_LOCKMETHOD);

 #ifdef USER_LOCKS

@@ -92,11 +90,10 @@
      * Allocate another tableId for long-term locks
      */
     LongTermTableId = LockMethodTableRename(LockTableId);
-    if (!(LongTermTableId))
+    if (!LockMethodIsValid(LongTermTableId))
         elog(ERROR, "could not rename long-term lock table");
+    Assert(LongTermTableId == USER_LOCKMETHOD);
 #endif
-
-    return LockTableId;
 }

 /*
diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
--- ../base/src/backend/storage/lmgr/lock.c    2003-08-18 00:41:12.000000000 +0200
+++ src/backend/storage/lmgr/lock.c    2003-09-07 07:53:16.000000000 +0200
@@ -46,7 +46,7 @@
 #define NLOCKENTS(maxBackends)    (max_locks_per_xact * (maxBackends))


-static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
+static int WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
            LOCK *lock, PROCLOCK *proclock);
 static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc,
                  int *myHolding);
@@ -111,7 +111,7 @@
              "req(%d,%d,%d,%d,%d,%d,%d)=%d "
              "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
              where, MAKE_OFFSET(lock),
-             lock->tag.lockmethod, lock->tag.relId, lock->tag.dbId,
+             lock->tag.lockmethodid, lock->tag.relId, lock->tag.dbId,
              lock->tag.objId.blkno, lock->grantMask,
              lock->requested[1], lock->requested[2], lock->requested[3],
              lock->requested[4], lock->requested[5], lock->requested[6],
@@ -150,19 +150,9 @@


 /*
- * These are to simplify/speed up some bit arithmetic.
- *
- * XXX is a fetch from a static array really faster than a shift?
- * Wouldn't bet on it...
+ * map from lock method id to the lock table structure
  */
-
-static LOCKMASK BITS_OFF[MAX_LOCKMODES];
-static LOCKMASK BITS_ON[MAX_LOCKMODES];
-
-/*
- * map from lockmethod to the lock table structure
- */
-static LOCKMETHODTABLE *LockMethodTable[MAX_LOCK_METHODS];
+static LockMethod LockMethods[MAX_LOCK_METHODS];

 static int    NumLockMethods;

@@ -173,28 +163,20 @@
 void
 InitLocks(void)
 {
-    int            i;
-    int            bit;
-
-    bit = 1;
-    for (i = 0; i < MAX_LOCKMODES; i++, bit <<= 1)
-    {
-        BITS_ON[i] = bit;
-        BITS_OFF[i] = ~bit;
-    }
+    /* NOP */
 }


 /*
  * Fetch the lock method table associated with a given lock
  */
-LOCKMETHODTABLE *
+LockMethod
 GetLocksMethodTable(LOCK *lock)
 {
-    LOCKMETHOD    lockmethod = LOCK_LOCKMETHOD(*lock);
+    LOCKMETHODID    lockmethodid = LOCK_LOCKMETHOD(*lock);

-    Assert(lockmethod > 0 && lockmethod < NumLockMethods);
-    return LockMethodTable[lockmethod];
+    Assert(0 < lockmethodid && lockmethodid < NumLockMethods);
+    return LockMethods[lockmethodid];
 }


@@ -205,7 +187,7 @@
  * Notes: just copying.  Should only be called once.
  */
 static void
-LockMethodInit(LOCKMETHODTABLE *lockMethodTable,
+LockMethodInit(LockMethod lockMethodTable,
                LOCKMASK *conflictsP,
                int numModes)
 {
@@ -226,13 +208,13 @@
  * by the postmaster are inherited by each backend, so they must be in
  * TopMemoryContext.
  */
-LOCKMETHOD
+LOCKMETHODID
 LockMethodTableInit(char *tabName,
                     LOCKMASK *conflictsP,
                     int numModes,
                     int maxBackends)
 {
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    newLockMethod;
     char       *shmemName;
     HASHCTL        info;
     int            hash_flags;
@@ -254,10 +236,10 @@

     /* each lock table has a header in shared memory */
     sprintf(shmemName, "%s (lock method table)", tabName);
-    lockMethodTable = (LOCKMETHODTABLE *)
-        ShmemInitStruct(shmemName, sizeof(LOCKMETHODTABLE), &found);
+    newLockMethod = (LockMethod)
+        ShmemInitStruct(shmemName, sizeof(LockMethodData), &found);

-    if (!lockMethodTable)
+    if (!newLockMethod)
         elog(FATAL, "could not initialize lock table \"%s\"", tabName);

     /*
@@ -275,15 +257,15 @@
      */
     if (!found)
     {
-        MemSet(lockMethodTable, 0, sizeof(LOCKMETHODTABLE));
-        lockMethodTable->masterLock = LockMgrLock;
-        lockMethodTable->lockmethod = NumLockMethods;
+        MemSet(newLockMethod, 0, sizeof(LockMethodData));
+        newLockMethod->masterLock = LockMgrLock;
+        newLockMethod->lockmethodid = NumLockMethods;
     }

     /*
      * other modules refer to the lock table by a lockmethod ID
      */
-    LockMethodTable[NumLockMethods] = lockMethodTable;
+    LockMethods[NumLockMethods] = newLockMethod;
     NumLockMethods++;
     Assert(NumLockMethods <= MAX_LOCK_METHODS);

@@ -297,15 +279,15 @@
     hash_flags = (HASH_ELEM | HASH_FUNCTION);

     sprintf(shmemName, "%s (lock hash)", tabName);
-    lockMethodTable->lockHash = ShmemInitHash(shmemName,
-                                              init_table_size,
-                                              max_table_size,
-                                              &info,
-                                              hash_flags);
+    newLockMethod->lockHash = ShmemInitHash(shmemName,
+                                            init_table_size,
+                                            max_table_size,
+                                            &info,
+                                            hash_flags);

-    if (!lockMethodTable->lockHash)
+    if (!newLockMethod->lockHash)
         elog(FATAL, "could not initialize lock table \"%s\"", tabName);
-    Assert(lockMethodTable->lockHash->hash == tag_hash);
+    Assert(newLockMethod->lockHash->hash == tag_hash);

     /*
      * allocate a hash table for PROCLOCK structs.    This is used to store
@@ -317,23 +299,23 @@
     hash_flags = (HASH_ELEM | HASH_FUNCTION);

     sprintf(shmemName, "%s (proclock hash)", tabName);
-    lockMethodTable->proclockHash = ShmemInitHash(shmemName,
-                                                  init_table_size,
-                                                  max_table_size,
-                                                  &info,
-                                                  hash_flags);
+    newLockMethod->proclockHash = ShmemInitHash(shmemName,
+                                                init_table_size,
+                                                max_table_size,
+                                                &info,
+                                                hash_flags);

-    if (!lockMethodTable->proclockHash)
+    if (!newLockMethod->proclockHash)
         elog(FATAL, "could not initialize lock table \"%s\"", tabName);

     /* init data structures */
-    LockMethodInit(lockMethodTable, conflictsP, numModes);
+    LockMethodInit(newLockMethod, conflictsP, numModes);

     LWLockRelease(LockMgrLock);

     pfree(shmemName);

-    return lockMethodTable->lockmethod;
+    return newLockMethod->lockmethodid;
 }

 /*
@@ -349,22 +331,22 @@
  *        short term and long term locks, yet store them all in one hashtable.
  */

-LOCKMETHOD
-LockMethodTableRename(LOCKMETHOD lockmethod)
+LOCKMETHODID
+LockMethodTableRename(LOCKMETHODID lockmethodid)
 {
-    LOCKMETHOD    newLockMethod;
+    LOCKMETHODID    newLockMethodId;

     if (NumLockMethods >= MAX_LOCK_METHODS)
         return INVALID_LOCKMETHOD;
-    if (LockMethodTable[lockmethod] == INVALID_LOCKMETHOD)
+    if (LockMethods[lockmethodid] == INVALID_LOCKMETHOD)
         return INVALID_LOCKMETHOD;

     /* other modules refer to the lock table by a lockmethod ID */
-    newLockMethod = NumLockMethods;
+    newLockMethodId = NumLockMethods;
     NumLockMethods++;

-    LockMethodTable[newLockMethod] = LockMethodTable[lockmethod];
-    return newLockMethod;
+    LockMethods[newLockMethodId] = LockMethods[lockmethodid];
+    return newLockMethodId;
 }

 /*
@@ -412,7 +394,7 @@
  *
  *                                        normal lock        user lock
  *
- *        lockmethod                        1                2
+ *        lockmethodid                    1                2
  *        tag.dbId                        database oid    database oid
  *        tag.relId                        rel oid or 0    0
  *        tag.objId                        block id        lock id2
@@ -429,7 +411,7 @@
  */

 bool
-LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode, bool dontWait)
 {
     PROCLOCK   *proclock;
@@ -438,25 +420,25 @@
     bool        found;
     LOCK       *lock;
     LWLockId    masterLock;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     int            status;
     int            myHolding[MAX_LOCKMODES];
     int            i;

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
+    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
         elog(LOG, "LockAcquire: user lock [%u] %s",
              locktag->objId.blkno, lock_mode_names[lockmode]);
 #endif

     /* ???????? This must be changed when short term locks will be used */
-    locktag->lockmethod = lockmethod;
+    locktag->lockmethodid = lockmethodid;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
     {
-        elog(WARNING, "bad lock table id: %d", lockmethod);
+        elog(WARNING, "bad lock table id: %d", lockmethodid);
         return FALSE;
     }

@@ -666,15 +648,12 @@
          * Construct bitmask of locks this process holds on this object.
          */
         {
-            int            heldLocks = 0;
-            int            tmpMask;
+            LOCKMASK        heldLocks = 0;

-            for (i = 1, tmpMask = 2;
-                 i <= lockMethodTable->numLockModes;
-                 i++, tmpMask <<= 1)
+            for (i = 1; i <= lockMethodTable->numLockModes; i++)
             {
                 if (myHolding[i] > 0)
-                    heldLocks |= tmpMask;
+                    heldLocks |= LOCKBIT_ON(i);
             }
             MyProc->heldLocks = heldLocks;
         }
@@ -682,7 +661,7 @@
         /*
          * Sleep till someone wakes me up.
          */
-        status = WaitOnLock(lockmethod, lockmode, lock, proclock);
+        status = WaitOnLock(lockmethodid, lockmode, lock, proclock);

         /*
          * NOTE: do not do any material change of state between here and
@@ -729,7 +708,7 @@
  * known.  If NULL is passed then these values will be computed internally.
  */
 int
-LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
+LockCheckConflicts(LockMethod lockMethodTable,
                    LOCKMODE lockmode,
                    LOCK *lock,
                    PROCLOCK *proclock,
@@ -737,9 +716,8 @@
                    int *myHolding)        /* myHolding[] array or NULL */
 {
     int            numLockModes = lockMethodTable->numLockModes;
-    int            bitmask;
-    int            i,
-                tmpMask;
+    LOCKMASK    bitmask;
+    int            i;
     int            localHolding[MAX_LOCKMODES];

     /*
@@ -772,11 +750,10 @@

     /* Compute mask of lock types held by other processes */
     bitmask = 0;
-    tmpMask = 2;
-    for (i = 1; i <= numLockModes; i++, tmpMask <<= 1)
+    for (i = 1; i <= numLockModes; i++)
     {
         if (lock->granted[i] != myHolding[i])
-            bitmask |= tmpMask;
+            bitmask |= LOCKBIT_ON(i);
     }

     /*
@@ -842,9 +819,9 @@
 {
     lock->nGranted++;
     lock->granted[lockmode]++;
-    lock->grantMask |= BITS_ON[lockmode];
+    lock->grantMask |= LOCKBIT_ON(lockmode);
     if (lock->granted[lockmode] == lock->requested[lockmode])
-        lock->waitMask &= BITS_OFF[lockmode];
+        lock->waitMask &= LOCKBIT_OFF(lockmode);
     LOCK_PRINT("GrantLock", lock, lockmode);
     Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
     Assert(lock->nGranted <= lock->nRequested);
@@ -862,14 +839,14 @@
  * The locktable's masterLock must be held at entry.
  */
 static int
-WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
+WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
            LOCK *lock, PROCLOCK *proclock)
 {
-    LOCKMETHODTABLE *lockMethodTable = LockMethodTable[lockmethod];
+    LockMethod    lockMethodTable = LockMethods[lockmethodid];
     char       *new_status,
                *old_status;

-    Assert(lockmethod < NumLockMethods);
+    Assert(lockmethodid < NumLockMethods);

     LOCK_PRINT("WaitOnLock: sleeping on lock", lock, lockmode);

@@ -957,7 +934,7 @@
     waitLock->requested[lockmode]--;
     /* don't forget to clear waitMask bit if appropriate */
     if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
-        waitLock->waitMask &= BITS_OFF[lockmode];
+        waitLock->waitMask &= LOCKBIT_OFF(lockmode);

     /* Clean up the proc's own state */
     proc->waitLock = NULL;
@@ -968,7 +945,7 @@
 }

 /*
- * LockRelease -- look up 'locktag' in lock table 'lockmethod' and
+ * LockRelease -- look up 'locktag' in lock table 'lockmethodid' and
  *        release one 'lockmode' lock on it.
  *
  * Side Effects: find any waiting processes that are now wakable,
@@ -978,27 +955,27 @@
  *        come along and request the lock.)
  */
 bool
-LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode)
 {
     LOCK       *lock;
     LWLockId    masterLock;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     PROCLOCK   *proclock;
     PROCLOCKTAG proclocktag;
     HTAB       *proclockTable;
     bool        wakeupNeeded = false;

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
+    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
         elog(LOG, "LockRelease: user lock tag [%u] %d", locktag->objId.blkno, lockmode);
 #endif

     /* ???????? This must be changed when short term locks will be used */
-    locktag->lockmethod = lockmethod;
+    locktag->lockmethodid = lockmethodid;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
     {
         elog(WARNING, "lockMethodTable is null in LockRelease");
@@ -1045,7 +1022,7 @@
     {
         LWLockRelease(masterLock);
 #ifdef USER_LOCKS
-        if (lockmethod == USER_LOCKMETHOD)
+        if (lockmethodid == USER_LOCKMETHOD)
             elog(WARNING, "no lock with this tag");
         else
 #endif
@@ -1083,7 +1060,7 @@
     if (lock->granted[lockmode] == 0)
     {
         /* change the conflict mask.  No more of this lock type. */
-        lock->grantMask &= BITS_OFF[lockmode];
+        lock->grantMask &= LOCKBIT_OFF(lockmode);
     }

     LOCK_PRINT("LockRelease: updated", lock, lockmode);
@@ -1173,29 +1150,29 @@
  * specified XID are released.
  */
 bool
-LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
+LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
                bool allxids, TransactionId xid)
 {
     SHM_QUEUE  *procHolders = &(proc->procHolders);
     PROCLOCK   *proclock;
     PROCLOCK   *nextHolder;
     LWLockId    masterLock;
-    LOCKMETHODTABLE *lockMethodTable;
+    LockMethod    lockMethodTable;
     int            i,
                 numLockModes;
     LOCK       *lock;

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
+    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
         elog(LOG, "LockReleaseAll: lockmethod=%d, pid=%d",
-             lockmethod, proc->pid);
+             lockmethodid, proc->pid);
 #endif

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
     {
-        elog(WARNING, "bad lock method: %d", lockmethod);
+        elog(WARNING, "bad lock method: %d", lockmethodid);
         return FALSE;
     }

@@ -1220,7 +1197,7 @@
         lock = (LOCK *) MAKE_PTR(proclock->tag.lock);

         /* Ignore items that are not of the lockmethod to be removed */
-        if (LOCK_LOCKMETHOD(*lock) != lockmethod)
+        if (LOCK_LOCKMETHOD(*lock) != lockmethodid)
             goto next_item;

         /* If not allxids, ignore items that are of the wrong xid */
@@ -1249,7 +1226,7 @@
                     lock->granted[i] -= proclock->holding[i];
                     Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
                     if (lock->granted[i] == 0)
-                        lock->grantMask &= BITS_OFF[i];
+                        lock->grantMask &= LOCKBIT_OFF(i);

                     /*
                      * Read comments in LockRelease
@@ -1331,7 +1308,7 @@
     LWLockRelease(masterLock);

 #ifdef LOCK_DEBUG
-    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
+    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
         elog(LOG, "LockReleaseAll done");
 #endif

@@ -1346,7 +1323,7 @@

     size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
     size += maxBackends * MAXALIGN(sizeof(PGPROC));        /* each MyProc */
-    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODTABLE));        /* each lockMethodTable */
+    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LockMethodData));        /* each lock method */

     /* lockHash table */
     size += hash_estimate_size(max_table_size, sizeof(LOCK));
@@ -1390,7 +1367,7 @@

     LWLockAcquire(LockMgrLock, LW_EXCLUSIVE);

-    proclockTable = LockMethodTable[DEFAULT_LOCKMETHOD]->proclockHash;
+    proclockTable = LockMethods[DEFAULT_LOCKMETHOD]->proclockHash;

     data->nelements = i = proclockTable->hctl->nentries;

@@ -1446,8 +1423,8 @@
     SHM_QUEUE  *procHolders;
     PROCLOCK   *proclock;
     LOCK       *lock;
-    int            lockmethod = DEFAULT_LOCKMETHOD;
-    LOCKMETHODTABLE *lockMethodTable;
+    int            lockmethodid = DEFAULT_LOCKMETHOD;
+    LockMethod    lockMethodTable;

     proc = MyProc;
     if (proc == NULL)
@@ -1455,8 +1432,8 @@

     procHolders = &proc->procHolders;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
         return;

@@ -1489,8 +1466,8 @@
     PGPROC       *proc;
     PROCLOCK   *proclock;
     LOCK       *lock;
-    int            lockmethod = DEFAULT_LOCKMETHOD;
-    LOCKMETHODTABLE *lockMethodTable;
+    int            lockmethodid = DEFAULT_LOCKMETHOD;
+    LockMethod    lockMethodTable;
     HTAB       *proclockTable;
     HASH_SEQ_STATUS status;

@@ -1498,8 +1475,8 @@
     if (proc == NULL)
         return;

-    Assert(lockmethod < NumLockMethods);
-    lockMethodTable = LockMethodTable[lockmethod];
+    Assert(lockmethodid < NumLockMethods);
+    lockMethodTable = LockMethods[lockmethodid];
     if (!lockMethodTable)
         return;

diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
--- ../base/src/backend/storage/lmgr/proc.c    2003-08-04 04:40:03.000000000 +0200
+++ src/backend/storage/lmgr/proc.c    2003-09-07 07:35:06.000000000 +0200
@@ -524,14 +524,14 @@
  * semaphore is normally zero, so when we try to acquire it, we sleep.
  */
 int
-ProcSleep(LOCKMETHODTABLE *lockMethodTable,
+ProcSleep(LockMethod lockMethodTable,
           LOCKMODE lockmode,
           LOCK *lock,
           PROCLOCK *proclock)
 {
     LWLockId    masterLock = lockMethodTable->masterLock;
     PROC_QUEUE *waitQueue = &(lock->waitProcs);
-    int            myHeldLocks = MyProc->heldLocks;
+    LOCKMASK    myHeldLocks = MyProc->heldLocks;
     bool        early_deadlock = false;
     PGPROC       *proc;
     int            i;
@@ -556,7 +556,7 @@
      */
     if (myHeldLocks != 0)
     {
-        int            aheadRequests = 0;
+        LOCKMASK    aheadRequests = 0;

         proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
         for (i = 0; i < waitQueue->size; i++)
@@ -596,7 +596,7 @@
                 break;
             }
             /* Nope, so advance to next waiter */
-            aheadRequests |= (1 << proc->waitLockMode);
+            aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
             proc = (PGPROC *) MAKE_PTR(proc->links.next);
         }

@@ -618,7 +618,7 @@
     SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
     waitQueue->size++;

-    lock->waitMask |= (1 << lockmode);
+    lock->waitMask |= LOCKBIT_ON(lockmode);

     /* Set up wait information in PGPROC object, too */
     MyProc->waitLock = lock;
@@ -750,12 +750,12 @@
  *        for lock, waken any that are no longer blocked.
  */
 void
-ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock)
+ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
 {
     PROC_QUEUE *waitQueue = &(lock->waitProcs);
     int            queue_size = waitQueue->size;
     PGPROC       *proc;
-    int            aheadRequests = 0;
+    LOCKMASK    aheadRequests = 0;

     Assert(queue_size >= 0);

@@ -796,7 +796,7 @@
              * Cannot wake this guy. Remember his request for later
              * checks.
              */
-            aheadRequests |= (1 << lockmode);
+            aheadRequests |= LOCKBIT_ON(lockmode);
             proc = (PGPROC *) MAKE_PTR(proc->links.next);
         }
     }
diff -ruN ../base/src/include/storage/lmgr.h src/include/storage/lmgr.h
--- ../base/src/include/storage/lmgr.h    2003-08-04 04:40:14.000000000 +0200
+++ src/include/storage/lmgr.h    2003-09-06 18:02:43.000000000 +0200
@@ -40,10 +40,7 @@
  * so increase that if you want to add more modes.
  */

-extern LOCKMETHOD LockTableId;
-
-
-extern LOCKMETHOD InitLockTable(int maxBackends);
+extern void InitLockTable(int maxBackends);
 extern void RelationInitLockInfo(Relation relation);

 /* Lock a relation */
diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
--- ../base/src/include/storage/lock.h    2003-08-04 04:40:14.000000000 +0200
+++ src/include/storage/lock.h    2003-09-07 07:25:13.000000000 +0200
@@ -42,22 +42,23 @@


 typedef int LOCKMASK;
-
 typedef int LOCKMODE;
-typedef int LOCKMETHOD;
-
 /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
 #define MAX_LOCKMODES        10

+#define LOCKBIT_ON(lockmode) (1 << (lockmode))
+#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
+
+typedef uint16 LOCKMETHODID;
 /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
 #define MAX_LOCK_METHODS    3

-#define INVALID_TABLEID        0
-
-#define INVALID_LOCKMETHOD    INVALID_TABLEID
+#define INVALID_LOCKMETHOD    0
 #define DEFAULT_LOCKMETHOD    1
 #define USER_LOCKMETHOD        2

+#define LockMethodIsValid(lockmethodid) ((lockmethodid) != INVALID_LOCKMETHOD)
+
 /*
  * There is normally only one lock method, the default one.
  * If user locks are enabled, an additional lock method is present.
@@ -83,15 +84,16 @@
  * masterLock -- synchronizes access to the table
  *
  */
-typedef struct LOCKMETHODTABLE
+typedef struct LockMethodData
 {
-    HTAB       *lockHash;
-    HTAB       *proclockHash;
-    LOCKMETHOD    lockmethod;
-    int            numLockModes;
-    int            conflictTab[MAX_LOCKMODES];
-    LWLockId    masterLock;
-} LOCKMETHODTABLE;
+    HTAB           *lockHash;
+    HTAB           *proclockHash;
+    LOCKMETHODID    lockmethodid;
+    int                numLockModes;
+    LOCKMASK        conflictTab[MAX_LOCKMODES];
+    LWLockId        masterLock;
+} LockMethodData;
+typedef LockMethodData *LockMethod;


 /*
@@ -115,7 +117,7 @@
      */
     OffsetNumber offnum;

-    uint16        lockmethod;        /* needed by userlocks */
+    LOCKMETHODID lockmethodid;        /* needed by userlocks */
 } LOCKTAG;


@@ -139,8 +141,8 @@
     LOCKTAG        tag;            /* unique identifier of lockable object */

     /* data */
-    int            grantMask;        /* bitmask for lock types already granted */
-    int            waitMask;        /* bitmask for lock types awaited */
+    LOCKMASK    grantMask;        /* bitmask for lock types already granted */
+    LOCKMASK    waitMask;        /* bitmask for lock types awaited */
     SHM_QUEUE    lockHolders;    /* list of PROCLOCK objects assoc. with
                                  * lock */
     PROC_QUEUE    waitProcs;        /* list of PGPROC objects waiting on lock */
@@ -151,7 +153,7 @@
     int            nGranted;        /* total of granted[] array */
 } LOCK;

-#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethod)
+#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethodid)


 /*
@@ -204,7 +206,7 @@
 } PROCLOCK;

 #define PROCLOCK_LOCKMETHOD(proclock) \
-        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethod)
+        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethodid)

 /*
  * This struct holds information passed from lmgr internals to the lock
@@ -227,17 +229,17 @@
  * function prototypes
  */
 extern void InitLocks(void);
-extern LOCKMETHODTABLE *GetLocksMethodTable(LOCK *lock);
-extern LOCKMETHOD LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
+extern LockMethod GetLocksMethodTable(LOCK *lock);
+extern LOCKMETHODID LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
                     int numModes, int maxBackends);
-extern LOCKMETHOD LockMethodTableRename(LOCKMETHOD lockmethod);
-extern bool LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+extern LOCKMETHODID LockMethodTableRename(LOCKMETHODID lockmethodid);
+extern bool LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode, bool dontWait);
-extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
+extern bool LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
             TransactionId xid, LOCKMODE lockmode);
-extern bool LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
+extern bool LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
                bool allxids, TransactionId xid);
-extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
+extern int LockCheckConflicts(LockMethod lockMethodTable,
                    LOCKMODE lockmode,
                    LOCK *lock, PROCLOCK *proclock, PGPROC *proc,
                    int *myHolding);
diff -ruN ../base/src/include/storage/proc.h src/include/storage/proc.h
--- ../base/src/include/storage/proc.h    2003-08-04 04:40:15.000000000 +0200
+++ src/include/storage/proc.h    2003-09-06 22:45:54.000000000 +0200
@@ -101,10 +101,10 @@
 extern void ProcReleaseLocks(bool isCommit);

 extern void ProcQueueInit(PROC_QUEUE *queue);
-extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
+extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode,
           LOCK *lock, PROCLOCK *proclock);
 extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
-extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
+extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
 extern bool LockWaitCancel(void);

 extern void ProcWaitForSignal(void);

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > This has been saved for the 7.5 release:
> >     http:/momjian.postgresql.org/cgi-bin/pgpatches2
>
> BTW, that page still calls itself "PostgreSQL Items For 7.4."

Thanks.  Fixed.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
This has been saved for the 7.5 release:

    http:/momjian.postgresql.org/cgi-bin/pgpatches2

---------------------------------------------------------------------------

Manfred Koizar wrote:
> On Mon, 8 Sep 2003 00:51:45 -0400 (EDT), Bruce Momjian
> <pgman@candle.pha.pa.us> wrote:
> >
> >This has been saved for the 7.5 release:
> >
> >    http:/momjian.postgresql.org/cgi-bin/pgpatches2
>
> Here is the combined patch.  Prior patches in this thread are hereby
> obsolete.
>
> Servus
>  Manfred

> diff -ruN ../base/src/backend/storage/ipc/ipci.c src/backend/storage/ipc/ipci.c
> --- ../base/src/backend/storage/ipc/ipci.c    2003-08-04 04:40:03.000000000 +0200
> +++ src/backend/storage/ipc/ipci.c    2003-09-06 16:53:54.000000000 +0200
> @@ -111,8 +111,7 @@
>       * Set up lock manager
>       */
>      InitLocks();
> -    if (InitLockTable(maxBackends) == INVALID_TABLEID)
> -        elog(FATAL, "could not create the lock table");
> +    InitLockTable(maxBackends);
>
>      /*
>       * Set up process table
> diff -ruN ../base/src/backend/storage/lmgr/deadlock.c src/backend/storage/lmgr/deadlock.c
> --- ../base/src/backend/storage/lmgr/deadlock.c    2003-08-08 23:42:00.000000000 +0200
> +++ src/backend/storage/lmgr/deadlock.c    2003-09-06 22:25:46.000000000 +0200
> @@ -428,7 +428,7 @@
>      LOCK       *lock;
>      PROCLOCK   *proclock;
>      SHM_QUEUE  *lockHolders;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      PROC_QUEUE *waitQueue;
>      int            queue_size;
>      int            conflictMask;
> diff -ruN ../base/src/backend/storage/lmgr/lmgr.c src/backend/storage/lmgr/lmgr.c
> --- ../base/src/backend/storage/lmgr/lmgr.c    2003-08-18 00:41:12.000000000 +0200
> +++ src/backend/storage/lmgr/lmgr.c    2003-09-06 18:10:48.000000000 +0200
> @@ -65,26 +65,24 @@
>
>  };
>
> -LOCKMETHOD    LockTableId = (LOCKMETHOD) NULL;
> -LOCKMETHOD    LongTermTableId = (LOCKMETHOD) NULL;
> +static    LOCKMETHODID    LockTableId = INVALID_LOCKMETHOD;
>
>  /*
>   * Create the lock table described by LockConflicts
>   */
> -LOCKMETHOD
> +void
>  InitLockTable(int maxBackends)
>  {
> -    int            lockmethod;
> +    LOCKMETHODID    LongTermTableId;
>
>      /* number of lock modes is lengthof()-1 because of dummy zero */
> -    lockmethod = LockMethodTableInit("LockTable",
> -                                     LockConflicts,
> -                                     lengthof(LockConflicts) - 1,
> -                                     maxBackends);
> -    LockTableId = lockmethod;
> -
> -    if (!(LockTableId))
> +    LockTableId = LockMethodTableInit("LockTable",
> +                                      LockConflicts,
> +                                      lengthof(LockConflicts) - 1,
> +                                      maxBackends);
> +    if (!LockMethodIsValid(LockTableId))
>          elog(ERROR, "could not initialize lock table");
> +    Assert(LockTableId == DEFAULT_LOCKMETHOD);
>
>  #ifdef USER_LOCKS
>
> @@ -92,11 +90,10 @@
>       * Allocate another tableId for long-term locks
>       */
>      LongTermTableId = LockMethodTableRename(LockTableId);
> -    if (!(LongTermTableId))
> +    if (!LockMethodIsValid(LongTermTableId))
>          elog(ERROR, "could not rename long-term lock table");
> +    Assert(LongTermTableId == USER_LOCKMETHOD);
>  #endif
> -
> -    return LockTableId;
>  }
>
>  /*
> diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
> --- ../base/src/backend/storage/lmgr/lock.c    2003-08-18 00:41:12.000000000 +0200
> +++ src/backend/storage/lmgr/lock.c    2003-09-07 07:53:16.000000000 +0200
> @@ -46,7 +46,7 @@
>  #define NLOCKENTS(maxBackends)    (max_locks_per_xact * (maxBackends))
>
>
> -static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
> +static int WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
>             LOCK *lock, PROCLOCK *proclock);
>  static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc,
>                   int *myHolding);
> @@ -111,7 +111,7 @@
>               "req(%d,%d,%d,%d,%d,%d,%d)=%d "
>               "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
>               where, MAKE_OFFSET(lock),
> -             lock->tag.lockmethod, lock->tag.relId, lock->tag.dbId,
> +             lock->tag.lockmethodid, lock->tag.relId, lock->tag.dbId,
>               lock->tag.objId.blkno, lock->grantMask,
>               lock->requested[1], lock->requested[2], lock->requested[3],
>               lock->requested[4], lock->requested[5], lock->requested[6],
> @@ -150,19 +150,9 @@
>
>
>  /*
> - * These are to simplify/speed up some bit arithmetic.
> - *
> - * XXX is a fetch from a static array really faster than a shift?
> - * Wouldn't bet on it...
> + * map from lock method id to the lock table structure
>   */
> -
> -static LOCKMASK BITS_OFF[MAX_LOCKMODES];
> -static LOCKMASK BITS_ON[MAX_LOCKMODES];
> -
> -/*
> - * map from lockmethod to the lock table structure
> - */
> -static LOCKMETHODTABLE *LockMethodTable[MAX_LOCK_METHODS];
> +static LockMethod LockMethods[MAX_LOCK_METHODS];
>
>  static int    NumLockMethods;
>
> @@ -173,28 +163,20 @@
>  void
>  InitLocks(void)
>  {
> -    int            i;
> -    int            bit;
> -
> -    bit = 1;
> -    for (i = 0; i < MAX_LOCKMODES; i++, bit <<= 1)
> -    {
> -        BITS_ON[i] = bit;
> -        BITS_OFF[i] = ~bit;
> -    }
> +    /* NOP */
>  }
>
>
>  /*
>   * Fetch the lock method table associated with a given lock
>   */
> -LOCKMETHODTABLE *
> +LockMethod
>  GetLocksMethodTable(LOCK *lock)
>  {
> -    LOCKMETHOD    lockmethod = LOCK_LOCKMETHOD(*lock);
> +    LOCKMETHODID    lockmethodid = LOCK_LOCKMETHOD(*lock);
>
> -    Assert(lockmethod > 0 && lockmethod < NumLockMethods);
> -    return LockMethodTable[lockmethod];
> +    Assert(0 < lockmethodid && lockmethodid < NumLockMethods);
> +    return LockMethods[lockmethodid];
>  }
>
>
> @@ -205,7 +187,7 @@
>   * Notes: just copying.  Should only be called once.
>   */
>  static void
> -LockMethodInit(LOCKMETHODTABLE *lockMethodTable,
> +LockMethodInit(LockMethod lockMethodTable,
>                 LOCKMASK *conflictsP,
>                 int numModes)
>  {
> @@ -226,13 +208,13 @@
>   * by the postmaster are inherited by each backend, so they must be in
>   * TopMemoryContext.
>   */
> -LOCKMETHOD
> +LOCKMETHODID
>  LockMethodTableInit(char *tabName,
>                      LOCKMASK *conflictsP,
>                      int numModes,
>                      int maxBackends)
>  {
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    newLockMethod;
>      char       *shmemName;
>      HASHCTL        info;
>      int            hash_flags;
> @@ -254,10 +236,10 @@
>
>      /* each lock table has a header in shared memory */
>      sprintf(shmemName, "%s (lock method table)", tabName);
> -    lockMethodTable = (LOCKMETHODTABLE *)
> -        ShmemInitStruct(shmemName, sizeof(LOCKMETHODTABLE), &found);
> +    newLockMethod = (LockMethod)
> +        ShmemInitStruct(shmemName, sizeof(LockMethodData), &found);
>
> -    if (!lockMethodTable)
> +    if (!newLockMethod)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
>
>      /*
> @@ -275,15 +257,15 @@
>       */
>      if (!found)
>      {
> -        MemSet(lockMethodTable, 0, sizeof(LOCKMETHODTABLE));
> -        lockMethodTable->masterLock = LockMgrLock;
> -        lockMethodTable->lockmethod = NumLockMethods;
> +        MemSet(newLockMethod, 0, sizeof(LockMethodData));
> +        newLockMethod->masterLock = LockMgrLock;
> +        newLockMethod->lockmethodid = NumLockMethods;
>      }
>
>      /*
>       * other modules refer to the lock table by a lockmethod ID
>       */
> -    LockMethodTable[NumLockMethods] = lockMethodTable;
> +    LockMethods[NumLockMethods] = newLockMethod;
>      NumLockMethods++;
>      Assert(NumLockMethods <= MAX_LOCK_METHODS);
>
> @@ -297,15 +279,15 @@
>      hash_flags = (HASH_ELEM | HASH_FUNCTION);
>
>      sprintf(shmemName, "%s (lock hash)", tabName);
> -    lockMethodTable->lockHash = ShmemInitHash(shmemName,
> -                                              init_table_size,
> -                                              max_table_size,
> -                                              &info,
> -                                              hash_flags);
> +    newLockMethod->lockHash = ShmemInitHash(shmemName,
> +                                            init_table_size,
> +                                            max_table_size,
> +                                            &info,
> +                                            hash_flags);
>
> -    if (!lockMethodTable->lockHash)
> +    if (!newLockMethod->lockHash)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
> -    Assert(lockMethodTable->lockHash->hash == tag_hash);
> +    Assert(newLockMethod->lockHash->hash == tag_hash);
>
>      /*
>       * allocate a hash table for PROCLOCK structs.    This is used to store
> @@ -317,23 +299,23 @@
>      hash_flags = (HASH_ELEM | HASH_FUNCTION);
>
>      sprintf(shmemName, "%s (proclock hash)", tabName);
> -    lockMethodTable->proclockHash = ShmemInitHash(shmemName,
> -                                                  init_table_size,
> -                                                  max_table_size,
> -                                                  &info,
> -                                                  hash_flags);
> +    newLockMethod->proclockHash = ShmemInitHash(shmemName,
> +                                                init_table_size,
> +                                                max_table_size,
> +                                                &info,
> +                                                hash_flags);
>
> -    if (!lockMethodTable->proclockHash)
> +    if (!newLockMethod->proclockHash)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
>
>      /* init data structures */
> -    LockMethodInit(lockMethodTable, conflictsP, numModes);
> +    LockMethodInit(newLockMethod, conflictsP, numModes);
>
>      LWLockRelease(LockMgrLock);
>
>      pfree(shmemName);
>
> -    return lockMethodTable->lockmethod;
> +    return newLockMethod->lockmethodid;
>  }
>
>  /*
> @@ -349,22 +331,22 @@
>   *        short term and long term locks, yet store them all in one hashtable.
>   */
>
> -LOCKMETHOD
> -LockMethodTableRename(LOCKMETHOD lockmethod)
> +LOCKMETHODID
> +LockMethodTableRename(LOCKMETHODID lockmethodid)
>  {
> -    LOCKMETHOD    newLockMethod;
> +    LOCKMETHODID    newLockMethodId;
>
>      if (NumLockMethods >= MAX_LOCK_METHODS)
>          return INVALID_LOCKMETHOD;
> -    if (LockMethodTable[lockmethod] == INVALID_LOCKMETHOD)
> +    if (LockMethods[lockmethodid] == INVALID_LOCKMETHOD)
>          return INVALID_LOCKMETHOD;
>
>      /* other modules refer to the lock table by a lockmethod ID */
> -    newLockMethod = NumLockMethods;
> +    newLockMethodId = NumLockMethods;
>      NumLockMethods++;
>
> -    LockMethodTable[newLockMethod] = LockMethodTable[lockmethod];
> -    return newLockMethod;
> +    LockMethods[newLockMethodId] = LockMethods[lockmethodid];
> +    return newLockMethodId;
>  }
>
>  /*
> @@ -412,7 +394,7 @@
>   *
>   *                                        normal lock        user lock
>   *
> - *        lockmethod                        1                2
> + *        lockmethodid                    1                2
>   *        tag.dbId                        database oid    database oid
>   *        tag.relId                        rel oid or 0    0
>   *        tag.objId                        block id        lock id2
> @@ -429,7 +411,7 @@
>   */
>
>  bool
> -LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode, bool dontWait)
>  {
>      PROCLOCK   *proclock;
> @@ -438,25 +420,25 @@
>      bool        found;
>      LOCK       *lock;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      int            status;
>      int            myHolding[MAX_LOCKMODES];
>      int            i;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
> +    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
>          elog(LOG, "LockAcquire: user lock [%u] %s",
>               locktag->objId.blkno, lock_mode_names[lockmode]);
>  #endif
>
>      /* ???????? This must be changed when short term locks will be used */
> -    locktag->lockmethod = lockmethod;
> +    locktag->lockmethodid = lockmethodid;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
> -        elog(WARNING, "bad lock table id: %d", lockmethod);
> +        elog(WARNING, "bad lock table id: %d", lockmethodid);
>          return FALSE;
>      }
>
> @@ -666,15 +648,12 @@
>           * Construct bitmask of locks this process holds on this object.
>           */
>          {
> -            int            heldLocks = 0;
> -            int            tmpMask;
> +            LOCKMASK        heldLocks = 0;
>
> -            for (i = 1, tmpMask = 2;
> -                 i <= lockMethodTable->numLockModes;
> -                 i++, tmpMask <<= 1)
> +            for (i = 1; i <= lockMethodTable->numLockModes; i++)
>              {
>                  if (myHolding[i] > 0)
> -                    heldLocks |= tmpMask;
> +                    heldLocks |= LOCKBIT_ON(i);
>              }
>              MyProc->heldLocks = heldLocks;
>          }
> @@ -682,7 +661,7 @@
>          /*
>           * Sleep till someone wakes me up.
>           */
> -        status = WaitOnLock(lockmethod, lockmode, lock, proclock);
> +        status = WaitOnLock(lockmethodid, lockmode, lock, proclock);
>
>          /*
>           * NOTE: do not do any material change of state between here and
> @@ -729,7 +708,7 @@
>   * known.  If NULL is passed then these values will be computed internally.
>   */
>  int
> -LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
> +LockCheckConflicts(LockMethod lockMethodTable,
>                     LOCKMODE lockmode,
>                     LOCK *lock,
>                     PROCLOCK *proclock,
> @@ -737,9 +716,8 @@
>                     int *myHolding)        /* myHolding[] array or NULL */
>  {
>      int            numLockModes = lockMethodTable->numLockModes;
> -    int            bitmask;
> -    int            i,
> -                tmpMask;
> +    LOCKMASK    bitmask;
> +    int            i;
>      int            localHolding[MAX_LOCKMODES];
>
>      /*
> @@ -772,11 +750,10 @@
>
>      /* Compute mask of lock types held by other processes */
>      bitmask = 0;
> -    tmpMask = 2;
> -    for (i = 1; i <= numLockModes; i++, tmpMask <<= 1)
> +    for (i = 1; i <= numLockModes; i++)
>      {
>          if (lock->granted[i] != myHolding[i])
> -            bitmask |= tmpMask;
> +            bitmask |= LOCKBIT_ON(i);
>      }
>
>      /*
> @@ -842,9 +819,9 @@
>  {
>      lock->nGranted++;
>      lock->granted[lockmode]++;
> -    lock->grantMask |= BITS_ON[lockmode];
> +    lock->grantMask |= LOCKBIT_ON(lockmode);
>      if (lock->granted[lockmode] == lock->requested[lockmode])
> -        lock->waitMask &= BITS_OFF[lockmode];
> +        lock->waitMask &= LOCKBIT_OFF(lockmode);
>      LOCK_PRINT("GrantLock", lock, lockmode);
>      Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
>      Assert(lock->nGranted <= lock->nRequested);
> @@ -862,14 +839,14 @@
>   * The locktable's masterLock must be held at entry.
>   */
>  static int
> -WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
> +WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
>             LOCK *lock, PROCLOCK *proclock)
>  {
> -    LOCKMETHODTABLE *lockMethodTable = LockMethodTable[lockmethod];
> +    LockMethod    lockMethodTable = LockMethods[lockmethodid];
>      char       *new_status,
>                 *old_status;
>
> -    Assert(lockmethod < NumLockMethods);
> +    Assert(lockmethodid < NumLockMethods);
>
>      LOCK_PRINT("WaitOnLock: sleeping on lock", lock, lockmode);
>
> @@ -957,7 +934,7 @@
>      waitLock->requested[lockmode]--;
>      /* don't forget to clear waitMask bit if appropriate */
>      if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
> -        waitLock->waitMask &= BITS_OFF[lockmode];
> +        waitLock->waitMask &= LOCKBIT_OFF(lockmode);
>
>      /* Clean up the proc's own state */
>      proc->waitLock = NULL;
> @@ -968,7 +945,7 @@
>  }
>
>  /*
> - * LockRelease -- look up 'locktag' in lock table 'lockmethod' and
> + * LockRelease -- look up 'locktag' in lock table 'lockmethodid' and
>   *        release one 'lockmode' lock on it.
>   *
>   * Side Effects: find any waiting processes that are now wakable,
> @@ -978,27 +955,27 @@
>   *        come along and request the lock.)
>   */
>  bool
> -LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode)
>  {
>      LOCK       *lock;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      PROCLOCK   *proclock;
>      PROCLOCKTAG proclocktag;
>      HTAB       *proclockTable;
>      bool        wakeupNeeded = false;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
> +    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
>          elog(LOG, "LockRelease: user lock tag [%u] %d", locktag->objId.blkno, lockmode);
>  #endif
>
>      /* ???????? This must be changed when short term locks will be used */
> -    locktag->lockmethod = lockmethod;
> +    locktag->lockmethodid = lockmethodid;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
>          elog(WARNING, "lockMethodTable is null in LockRelease");
> @@ -1045,7 +1022,7 @@
>      {
>          LWLockRelease(masterLock);
>  #ifdef USER_LOCKS
> -        if (lockmethod == USER_LOCKMETHOD)
> +        if (lockmethodid == USER_LOCKMETHOD)
>              elog(WARNING, "no lock with this tag");
>          else
>  #endif
> @@ -1083,7 +1060,7 @@
>      if (lock->granted[lockmode] == 0)
>      {
>          /* change the conflict mask.  No more of this lock type. */
> -        lock->grantMask &= BITS_OFF[lockmode];
> +        lock->grantMask &= LOCKBIT_OFF(lockmode);
>      }
>
>      LOCK_PRINT("LockRelease: updated", lock, lockmode);
> @@ -1173,29 +1150,29 @@
>   * specified XID are released.
>   */
>  bool
> -LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
> +LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
>                 bool allxids, TransactionId xid)
>  {
>      SHM_QUEUE  *procHolders = &(proc->procHolders);
>      PROCLOCK   *proclock;
>      PROCLOCK   *nextHolder;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      int            i,
>                  numLockModes;
>      LOCK       *lock;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
> +    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
>          elog(LOG, "LockReleaseAll: lockmethod=%d, pid=%d",
> -             lockmethod, proc->pid);
> +             lockmethodid, proc->pid);
>  #endif
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
> -        elog(WARNING, "bad lock method: %d", lockmethod);
> +        elog(WARNING, "bad lock method: %d", lockmethodid);
>          return FALSE;
>      }
>
> @@ -1220,7 +1197,7 @@
>          lock = (LOCK *) MAKE_PTR(proclock->tag.lock);
>
>          /* Ignore items that are not of the lockmethod to be removed */
> -        if (LOCK_LOCKMETHOD(*lock) != lockmethod)
> +        if (LOCK_LOCKMETHOD(*lock) != lockmethodid)
>              goto next_item;
>
>          /* If not allxids, ignore items that are of the wrong xid */
> @@ -1249,7 +1226,7 @@
>                      lock->granted[i] -= proclock->holding[i];
>                      Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
>                      if (lock->granted[i] == 0)
> -                        lock->grantMask &= BITS_OFF[i];
> +                        lock->grantMask &= LOCKBIT_OFF(i);
>
>                      /*
>                       * Read comments in LockRelease
> @@ -1331,7 +1308,7 @@
>      LWLockRelease(masterLock);
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
> +    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
>          elog(LOG, "LockReleaseAll done");
>  #endif
>
> @@ -1346,7 +1323,7 @@
>
>      size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
>      size += maxBackends * MAXALIGN(sizeof(PGPROC));        /* each MyProc */
> -    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODTABLE));        /* each lockMethodTable */
> +    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LockMethodData));        /* each lock method */
>
>      /* lockHash table */
>      size += hash_estimate_size(max_table_size, sizeof(LOCK));
> @@ -1390,7 +1367,7 @@
>
>      LWLockAcquire(LockMgrLock, LW_EXCLUSIVE);
>
> -    proclockTable = LockMethodTable[DEFAULT_LOCKMETHOD]->proclockHash;
> +    proclockTable = LockMethods[DEFAULT_LOCKMETHOD]->proclockHash;
>
>      data->nelements = i = proclockTable->hctl->nentries;
>
> @@ -1446,8 +1423,8 @@
>      SHM_QUEUE  *procHolders;
>      PROCLOCK   *proclock;
>      LOCK       *lock;
> -    int            lockmethod = DEFAULT_LOCKMETHOD;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    int            lockmethodid = DEFAULT_LOCKMETHOD;
> +    LockMethod    lockMethodTable;
>
>      proc = MyProc;
>      if (proc == NULL)
> @@ -1455,8 +1432,8 @@
>
>      procHolders = &proc->procHolders;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>          return;
>
> @@ -1489,8 +1466,8 @@
>      PGPROC       *proc;
>      PROCLOCK   *proclock;
>      LOCK       *lock;
> -    int            lockmethod = DEFAULT_LOCKMETHOD;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    int            lockmethodid = DEFAULT_LOCKMETHOD;
> +    LockMethod    lockMethodTable;
>      HTAB       *proclockTable;
>      HASH_SEQ_STATUS status;
>
> @@ -1498,8 +1475,8 @@
>      if (proc == NULL)
>          return;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>          return;
>
> diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
> --- ../base/src/backend/storage/lmgr/proc.c    2003-08-04 04:40:03.000000000 +0200
> +++ src/backend/storage/lmgr/proc.c    2003-09-07 07:35:06.000000000 +0200
> @@ -524,14 +524,14 @@
>   * semaphore is normally zero, so when we try to acquire it, we sleep.
>   */
>  int
> -ProcSleep(LOCKMETHODTABLE *lockMethodTable,
> +ProcSleep(LockMethod lockMethodTable,
>            LOCKMODE lockmode,
>            LOCK *lock,
>            PROCLOCK *proclock)
>  {
>      LWLockId    masterLock = lockMethodTable->masterLock;
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
> -    int            myHeldLocks = MyProc->heldLocks;
> +    LOCKMASK    myHeldLocks = MyProc->heldLocks;
>      bool        early_deadlock = false;
>      PGPROC       *proc;
>      int            i;
> @@ -556,7 +556,7 @@
>       */
>      if (myHeldLocks != 0)
>      {
> -        int            aheadRequests = 0;
> +        LOCKMASK    aheadRequests = 0;
>
>          proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
>          for (i = 0; i < waitQueue->size; i++)
> @@ -596,7 +596,7 @@
>                  break;
>              }
>              /* Nope, so advance to next waiter */
> -            aheadRequests |= (1 << proc->waitLockMode);
> +            aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>
> @@ -618,7 +618,7 @@
>      SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
>      waitQueue->size++;
>
> -    lock->waitMask |= (1 << lockmode);
> +    lock->waitMask |= LOCKBIT_ON(lockmode);
>
>      /* Set up wait information in PGPROC object, too */
>      MyProc->waitLock = lock;
> @@ -750,12 +750,12 @@
>   *        for lock, waken any that are no longer blocked.
>   */
>  void
> -ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock)
> +ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
>  {
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
>      int            queue_size = waitQueue->size;
>      PGPROC       *proc;
> -    int            aheadRequests = 0;
> +    LOCKMASK    aheadRequests = 0;
>
>      Assert(queue_size >= 0);
>
> @@ -796,7 +796,7 @@
>               * Cannot wake this guy. Remember his request for later
>               * checks.
>               */
> -            aheadRequests |= (1 << lockmode);
> +            aheadRequests |= LOCKBIT_ON(lockmode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>      }
> diff -ruN ../base/src/include/storage/lmgr.h src/include/storage/lmgr.h
> --- ../base/src/include/storage/lmgr.h    2003-08-04 04:40:14.000000000 +0200
> +++ src/include/storage/lmgr.h    2003-09-06 18:02:43.000000000 +0200
> @@ -40,10 +40,7 @@
>   * so increase that if you want to add more modes.
>   */
>
> -extern LOCKMETHOD LockTableId;
> -
> -
> -extern LOCKMETHOD InitLockTable(int maxBackends);
> +extern void InitLockTable(int maxBackends);
>  extern void RelationInitLockInfo(Relation relation);
>
>  /* Lock a relation */
> diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
> --- ../base/src/include/storage/lock.h    2003-08-04 04:40:14.000000000 +0200
> +++ src/include/storage/lock.h    2003-09-07 07:25:13.000000000 +0200
> @@ -42,22 +42,23 @@
>
>
>  typedef int LOCKMASK;
> -
>  typedef int LOCKMODE;
> -typedef int LOCKMETHOD;
> -
>  /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
>  #define MAX_LOCKMODES        10
>
> +#define LOCKBIT_ON(lockmode) (1 << (lockmode))
> +#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
> +
> +typedef uint16 LOCKMETHODID;
>  /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
>  #define MAX_LOCK_METHODS    3
>
> -#define INVALID_TABLEID        0
> -
> -#define INVALID_LOCKMETHOD    INVALID_TABLEID
> +#define INVALID_LOCKMETHOD    0
>  #define DEFAULT_LOCKMETHOD    1
>  #define USER_LOCKMETHOD        2
>
> +#define LockMethodIsValid(lockmethodid) ((lockmethodid) != INVALID_LOCKMETHOD)
> +
>  /*
>   * There is normally only one lock method, the default one.
>   * If user locks are enabled, an additional lock method is present.
> @@ -83,15 +84,16 @@
>   * masterLock -- synchronizes access to the table
>   *
>   */
> -typedef struct LOCKMETHODTABLE
> +typedef struct LockMethodData
>  {
> -    HTAB       *lockHash;
> -    HTAB       *proclockHash;
> -    LOCKMETHOD    lockmethod;
> -    int            numLockModes;
> -    int            conflictTab[MAX_LOCKMODES];
> -    LWLockId    masterLock;
> -} LOCKMETHODTABLE;
> +    HTAB           *lockHash;
> +    HTAB           *proclockHash;
> +    LOCKMETHODID    lockmethodid;
> +    int                numLockModes;
> +    LOCKMASK        conflictTab[MAX_LOCKMODES];
> +    LWLockId        masterLock;
> +} LockMethodData;
> +typedef LockMethodData *LockMethod;
>
>
>  /*
> @@ -115,7 +117,7 @@
>       */
>      OffsetNumber offnum;
>
> -    uint16        lockmethod;        /* needed by userlocks */
> +    LOCKMETHODID lockmethodid;        /* needed by userlocks */
>  } LOCKTAG;
>
>
> @@ -139,8 +141,8 @@
>      LOCKTAG        tag;            /* unique identifier of lockable object */
>
>      /* data */
> -    int            grantMask;        /* bitmask for lock types already granted */
> -    int            waitMask;        /* bitmask for lock types awaited */
> +    LOCKMASK    grantMask;        /* bitmask for lock types already granted */
> +    LOCKMASK    waitMask;        /* bitmask for lock types awaited */
>      SHM_QUEUE    lockHolders;    /* list of PROCLOCK objects assoc. with
>                                   * lock */
>      PROC_QUEUE    waitProcs;        /* list of PGPROC objects waiting on lock */
> @@ -151,7 +153,7 @@
>      int            nGranted;        /* total of granted[] array */
>  } LOCK;
>
> -#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethod)
> +#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethodid)
>
>
>  /*
> @@ -204,7 +206,7 @@
>  } PROCLOCK;
>
>  #define PROCLOCK_LOCKMETHOD(proclock) \
> -        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethod)
> +        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethodid)
>
>  /*
>   * This struct holds information passed from lmgr internals to the lock
> @@ -227,17 +229,17 @@
>   * function prototypes
>   */
>  extern void InitLocks(void);
> -extern LOCKMETHODTABLE *GetLocksMethodTable(LOCK *lock);
> -extern LOCKMETHOD LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
> +extern LockMethod GetLocksMethodTable(LOCK *lock);
> +extern LOCKMETHODID LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
>                      int numModes, int maxBackends);
> -extern LOCKMETHOD LockMethodTableRename(LOCKMETHOD lockmethod);
> -extern bool LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +extern LOCKMETHODID LockMethodTableRename(LOCKMETHODID lockmethodid);
> +extern bool LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode, bool dontWait);
> -extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +extern bool LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode);
> -extern bool LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
> +extern bool LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
>                 bool allxids, TransactionId xid);
> -extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
> +extern int LockCheckConflicts(LockMethod lockMethodTable,
>                     LOCKMODE lockmode,
>                     LOCK *lock, PROCLOCK *proclock, PGPROC *proc,
>                     int *myHolding);
> diff -ruN ../base/src/include/storage/proc.h src/include/storage/proc.h
> --- ../base/src/include/storage/proc.h    2003-08-04 04:40:15.000000000 +0200
> +++ src/include/storage/proc.h    2003-09-06 22:45:54.000000000 +0200
> @@ -101,10 +101,10 @@
>  extern void ProcReleaseLocks(bool isCommit);
>
>  extern void ProcQueueInit(PROC_QUEUE *queue);
> -extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
> +extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode,
>            LOCK *lock, PROCLOCK *proclock);
>  extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
> -extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
> +extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
>  extern bool LockWaitCancel(void);
>
>  extern void ProcWaitForSignal(void);

>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
Manfred, can I get a description for this patch?  Thanks.

---------------------------------------------------------------------------

Manfred Koizar wrote:
> On Mon, 8 Sep 2003 00:51:45 -0400 (EDT), Bruce Momjian
> <pgman@candle.pha.pa.us> wrote:
> >
> >This has been saved for the 7.5 release:
> >
> >    http:/momjian.postgresql.org/cgi-bin/pgpatches2
>
> Here is the combined patch.  Prior patches in this thread are hereby
> obsolete.
>
> Servus
>  Manfred

> diff -ruN ../base/src/backend/storage/ipc/ipci.c src/backend/storage/ipc/ipci.c
> --- ../base/src/backend/storage/ipc/ipci.c    2003-08-04 04:40:03.000000000 +0200
> +++ src/backend/storage/ipc/ipci.c    2003-09-06 16:53:54.000000000 +0200
> @@ -111,8 +111,7 @@
>       * Set up lock manager
>       */
>      InitLocks();
> -    if (InitLockTable(maxBackends) == INVALID_TABLEID)
> -        elog(FATAL, "could not create the lock table");
> +    InitLockTable(maxBackends);
>
>      /*
>       * Set up process table
> diff -ruN ../base/src/backend/storage/lmgr/deadlock.c src/backend/storage/lmgr/deadlock.c
> --- ../base/src/backend/storage/lmgr/deadlock.c    2003-08-08 23:42:00.000000000 +0200
> +++ src/backend/storage/lmgr/deadlock.c    2003-09-06 22:25:46.000000000 +0200
> @@ -428,7 +428,7 @@
>      LOCK       *lock;
>      PROCLOCK   *proclock;
>      SHM_QUEUE  *lockHolders;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      PROC_QUEUE *waitQueue;
>      int            queue_size;
>      int            conflictMask;
> diff -ruN ../base/src/backend/storage/lmgr/lmgr.c src/backend/storage/lmgr/lmgr.c
> --- ../base/src/backend/storage/lmgr/lmgr.c    2003-08-18 00:41:12.000000000 +0200
> +++ src/backend/storage/lmgr/lmgr.c    2003-09-06 18:10:48.000000000 +0200
> @@ -65,26 +65,24 @@
>
>  };
>
> -LOCKMETHOD    LockTableId = (LOCKMETHOD) NULL;
> -LOCKMETHOD    LongTermTableId = (LOCKMETHOD) NULL;
> +static    LOCKMETHODID    LockTableId = INVALID_LOCKMETHOD;
>
>  /*
>   * Create the lock table described by LockConflicts
>   */
> -LOCKMETHOD
> +void
>  InitLockTable(int maxBackends)
>  {
> -    int            lockmethod;
> +    LOCKMETHODID    LongTermTableId;
>
>      /* number of lock modes is lengthof()-1 because of dummy zero */
> -    lockmethod = LockMethodTableInit("LockTable",
> -                                     LockConflicts,
> -                                     lengthof(LockConflicts) - 1,
> -                                     maxBackends);
> -    LockTableId = lockmethod;
> -
> -    if (!(LockTableId))
> +    LockTableId = LockMethodTableInit("LockTable",
> +                                      LockConflicts,
> +                                      lengthof(LockConflicts) - 1,
> +                                      maxBackends);
> +    if (!LockMethodIsValid(LockTableId))
>          elog(ERROR, "could not initialize lock table");
> +    Assert(LockTableId == DEFAULT_LOCKMETHOD);
>
>  #ifdef USER_LOCKS
>
> @@ -92,11 +90,10 @@
>       * Allocate another tableId for long-term locks
>       */
>      LongTermTableId = LockMethodTableRename(LockTableId);
> -    if (!(LongTermTableId))
> +    if (!LockMethodIsValid(LongTermTableId))
>          elog(ERROR, "could not rename long-term lock table");
> +    Assert(LongTermTableId == USER_LOCKMETHOD);
>  #endif
> -
> -    return LockTableId;
>  }
>
>  /*
> diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
> --- ../base/src/backend/storage/lmgr/lock.c    2003-08-18 00:41:12.000000000 +0200
> +++ src/backend/storage/lmgr/lock.c    2003-09-07 07:53:16.000000000 +0200
> @@ -46,7 +46,7 @@
>  #define NLOCKENTS(maxBackends)    (max_locks_per_xact * (maxBackends))
>
>
> -static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
> +static int WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
>             LOCK *lock, PROCLOCK *proclock);
>  static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc,
>                   int *myHolding);
> @@ -111,7 +111,7 @@
>               "req(%d,%d,%d,%d,%d,%d,%d)=%d "
>               "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
>               where, MAKE_OFFSET(lock),
> -             lock->tag.lockmethod, lock->tag.relId, lock->tag.dbId,
> +             lock->tag.lockmethodid, lock->tag.relId, lock->tag.dbId,
>               lock->tag.objId.blkno, lock->grantMask,
>               lock->requested[1], lock->requested[2], lock->requested[3],
>               lock->requested[4], lock->requested[5], lock->requested[6],
> @@ -150,19 +150,9 @@
>
>
>  /*
> - * These are to simplify/speed up some bit arithmetic.
> - *
> - * XXX is a fetch from a static array really faster than a shift?
> - * Wouldn't bet on it...
> + * map from lock method id to the lock table structure
>   */
> -
> -static LOCKMASK BITS_OFF[MAX_LOCKMODES];
> -static LOCKMASK BITS_ON[MAX_LOCKMODES];
> -
> -/*
> - * map from lockmethod to the lock table structure
> - */
> -static LOCKMETHODTABLE *LockMethodTable[MAX_LOCK_METHODS];
> +static LockMethod LockMethods[MAX_LOCK_METHODS];
>
>  static int    NumLockMethods;
>
> @@ -173,28 +163,20 @@
>  void
>  InitLocks(void)
>  {
> -    int            i;
> -    int            bit;
> -
> -    bit = 1;
> -    for (i = 0; i < MAX_LOCKMODES; i++, bit <<= 1)
> -    {
> -        BITS_ON[i] = bit;
> -        BITS_OFF[i] = ~bit;
> -    }
> +    /* NOP */
>  }
>
>
>  /*
>   * Fetch the lock method table associated with a given lock
>   */
> -LOCKMETHODTABLE *
> +LockMethod
>  GetLocksMethodTable(LOCK *lock)
>  {
> -    LOCKMETHOD    lockmethod = LOCK_LOCKMETHOD(*lock);
> +    LOCKMETHODID    lockmethodid = LOCK_LOCKMETHOD(*lock);
>
> -    Assert(lockmethod > 0 && lockmethod < NumLockMethods);
> -    return LockMethodTable[lockmethod];
> +    Assert(0 < lockmethodid && lockmethodid < NumLockMethods);
> +    return LockMethods[lockmethodid];
>  }
>
>
> @@ -205,7 +187,7 @@
>   * Notes: just copying.  Should only be called once.
>   */
>  static void
> -LockMethodInit(LOCKMETHODTABLE *lockMethodTable,
> +LockMethodInit(LockMethod lockMethodTable,
>                 LOCKMASK *conflictsP,
>                 int numModes)
>  {
> @@ -226,13 +208,13 @@
>   * by the postmaster are inherited by each backend, so they must be in
>   * TopMemoryContext.
>   */
> -LOCKMETHOD
> +LOCKMETHODID
>  LockMethodTableInit(char *tabName,
>                      LOCKMASK *conflictsP,
>                      int numModes,
>                      int maxBackends)
>  {
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    newLockMethod;
>      char       *shmemName;
>      HASHCTL        info;
>      int            hash_flags;
> @@ -254,10 +236,10 @@
>
>      /* each lock table has a header in shared memory */
>      sprintf(shmemName, "%s (lock method table)", tabName);
> -    lockMethodTable = (LOCKMETHODTABLE *)
> -        ShmemInitStruct(shmemName, sizeof(LOCKMETHODTABLE), &found);
> +    newLockMethod = (LockMethod)
> +        ShmemInitStruct(shmemName, sizeof(LockMethodData), &found);
>
> -    if (!lockMethodTable)
> +    if (!newLockMethod)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
>
>      /*
> @@ -275,15 +257,15 @@
>       */
>      if (!found)
>      {
> -        MemSet(lockMethodTable, 0, sizeof(LOCKMETHODTABLE));
> -        lockMethodTable->masterLock = LockMgrLock;
> -        lockMethodTable->lockmethod = NumLockMethods;
> +        MemSet(newLockMethod, 0, sizeof(LockMethodData));
> +        newLockMethod->masterLock = LockMgrLock;
> +        newLockMethod->lockmethodid = NumLockMethods;
>      }
>
>      /*
>       * other modules refer to the lock table by a lockmethod ID
>       */
> -    LockMethodTable[NumLockMethods] = lockMethodTable;
> +    LockMethods[NumLockMethods] = newLockMethod;
>      NumLockMethods++;
>      Assert(NumLockMethods <= MAX_LOCK_METHODS);
>
> @@ -297,15 +279,15 @@
>      hash_flags = (HASH_ELEM | HASH_FUNCTION);
>
>      sprintf(shmemName, "%s (lock hash)", tabName);
> -    lockMethodTable->lockHash = ShmemInitHash(shmemName,
> -                                              init_table_size,
> -                                              max_table_size,
> -                                              &info,
> -                                              hash_flags);
> +    newLockMethod->lockHash = ShmemInitHash(shmemName,
> +                                            init_table_size,
> +                                            max_table_size,
> +                                            &info,
> +                                            hash_flags);
>
> -    if (!lockMethodTable->lockHash)
> +    if (!newLockMethod->lockHash)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
> -    Assert(lockMethodTable->lockHash->hash == tag_hash);
> +    Assert(newLockMethod->lockHash->hash == tag_hash);
>
>      /*
>       * allocate a hash table for PROCLOCK structs.    This is used to store
> @@ -317,23 +299,23 @@
>      hash_flags = (HASH_ELEM | HASH_FUNCTION);
>
>      sprintf(shmemName, "%s (proclock hash)", tabName);
> -    lockMethodTable->proclockHash = ShmemInitHash(shmemName,
> -                                                  init_table_size,
> -                                                  max_table_size,
> -                                                  &info,
> -                                                  hash_flags);
> +    newLockMethod->proclockHash = ShmemInitHash(shmemName,
> +                                                init_table_size,
> +                                                max_table_size,
> +                                                &info,
> +                                                hash_flags);
>
> -    if (!lockMethodTable->proclockHash)
> +    if (!newLockMethod->proclockHash)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
>
>      /* init data structures */
> -    LockMethodInit(lockMethodTable, conflictsP, numModes);
> +    LockMethodInit(newLockMethod, conflictsP, numModes);
>
>      LWLockRelease(LockMgrLock);
>
>      pfree(shmemName);
>
> -    return lockMethodTable->lockmethod;
> +    return newLockMethod->lockmethodid;
>  }
>
>  /*
> @@ -349,22 +331,22 @@
>   *        short term and long term locks, yet store them all in one hashtable.
>   */
>
> -LOCKMETHOD
> -LockMethodTableRename(LOCKMETHOD lockmethod)
> +LOCKMETHODID
> +LockMethodTableRename(LOCKMETHODID lockmethodid)
>  {
> -    LOCKMETHOD    newLockMethod;
> +    LOCKMETHODID    newLockMethodId;
>
>      if (NumLockMethods >= MAX_LOCK_METHODS)
>          return INVALID_LOCKMETHOD;
> -    if (LockMethodTable[lockmethod] == INVALID_LOCKMETHOD)
> +    if (LockMethods[lockmethodid] == INVALID_LOCKMETHOD)
>          return INVALID_LOCKMETHOD;
>
>      /* other modules refer to the lock table by a lockmethod ID */
> -    newLockMethod = NumLockMethods;
> +    newLockMethodId = NumLockMethods;
>      NumLockMethods++;
>
> -    LockMethodTable[newLockMethod] = LockMethodTable[lockmethod];
> -    return newLockMethod;
> +    LockMethods[newLockMethodId] = LockMethods[lockmethodid];
> +    return newLockMethodId;
>  }
>
>  /*
> @@ -412,7 +394,7 @@
>   *
>   *                                        normal lock        user lock
>   *
> - *        lockmethod                        1                2
> + *        lockmethodid                    1                2
>   *        tag.dbId                        database oid    database oid
>   *        tag.relId                        rel oid or 0    0
>   *        tag.objId                        block id        lock id2
> @@ -429,7 +411,7 @@
>   */
>
>  bool
> -LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode, bool dontWait)
>  {
>      PROCLOCK   *proclock;
> @@ -438,25 +420,25 @@
>      bool        found;
>      LOCK       *lock;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      int            status;
>      int            myHolding[MAX_LOCKMODES];
>      int            i;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
> +    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
>          elog(LOG, "LockAcquire: user lock [%u] %s",
>               locktag->objId.blkno, lock_mode_names[lockmode]);
>  #endif
>
>      /* ???????? This must be changed when short term locks will be used */
> -    locktag->lockmethod = lockmethod;
> +    locktag->lockmethodid = lockmethodid;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
> -        elog(WARNING, "bad lock table id: %d", lockmethod);
> +        elog(WARNING, "bad lock table id: %d", lockmethodid);
>          return FALSE;
>      }
>
> @@ -666,15 +648,12 @@
>           * Construct bitmask of locks this process holds on this object.
>           */
>          {
> -            int            heldLocks = 0;
> -            int            tmpMask;
> +            LOCKMASK        heldLocks = 0;
>
> -            for (i = 1, tmpMask = 2;
> -                 i <= lockMethodTable->numLockModes;
> -                 i++, tmpMask <<= 1)
> +            for (i = 1; i <= lockMethodTable->numLockModes; i++)
>              {
>                  if (myHolding[i] > 0)
> -                    heldLocks |= tmpMask;
> +                    heldLocks |= LOCKBIT_ON(i);
>              }
>              MyProc->heldLocks = heldLocks;
>          }
> @@ -682,7 +661,7 @@
>          /*
>           * Sleep till someone wakes me up.
>           */
> -        status = WaitOnLock(lockmethod, lockmode, lock, proclock);
> +        status = WaitOnLock(lockmethodid, lockmode, lock, proclock);
>
>          /*
>           * NOTE: do not do any material change of state between here and
> @@ -729,7 +708,7 @@
>   * known.  If NULL is passed then these values will be computed internally.
>   */
>  int
> -LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
> +LockCheckConflicts(LockMethod lockMethodTable,
>                     LOCKMODE lockmode,
>                     LOCK *lock,
>                     PROCLOCK *proclock,
> @@ -737,9 +716,8 @@
>                     int *myHolding)        /* myHolding[] array or NULL */
>  {
>      int            numLockModes = lockMethodTable->numLockModes;
> -    int            bitmask;
> -    int            i,
> -                tmpMask;
> +    LOCKMASK    bitmask;
> +    int            i;
>      int            localHolding[MAX_LOCKMODES];
>
>      /*
> @@ -772,11 +750,10 @@
>
>      /* Compute mask of lock types held by other processes */
>      bitmask = 0;
> -    tmpMask = 2;
> -    for (i = 1; i <= numLockModes; i++, tmpMask <<= 1)
> +    for (i = 1; i <= numLockModes; i++)
>      {
>          if (lock->granted[i] != myHolding[i])
> -            bitmask |= tmpMask;
> +            bitmask |= LOCKBIT_ON(i);
>      }
>
>      /*
> @@ -842,9 +819,9 @@
>  {
>      lock->nGranted++;
>      lock->granted[lockmode]++;
> -    lock->grantMask |= BITS_ON[lockmode];
> +    lock->grantMask |= LOCKBIT_ON(lockmode);
>      if (lock->granted[lockmode] == lock->requested[lockmode])
> -        lock->waitMask &= BITS_OFF[lockmode];
> +        lock->waitMask &= LOCKBIT_OFF(lockmode);
>      LOCK_PRINT("GrantLock", lock, lockmode);
>      Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
>      Assert(lock->nGranted <= lock->nRequested);
> @@ -862,14 +839,14 @@
>   * The locktable's masterLock must be held at entry.
>   */
>  static int
> -WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
> +WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
>             LOCK *lock, PROCLOCK *proclock)
>  {
> -    LOCKMETHODTABLE *lockMethodTable = LockMethodTable[lockmethod];
> +    LockMethod    lockMethodTable = LockMethods[lockmethodid];
>      char       *new_status,
>                 *old_status;
>
> -    Assert(lockmethod < NumLockMethods);
> +    Assert(lockmethodid < NumLockMethods);
>
>      LOCK_PRINT("WaitOnLock: sleeping on lock", lock, lockmode);
>
> @@ -957,7 +934,7 @@
>      waitLock->requested[lockmode]--;
>      /* don't forget to clear waitMask bit if appropriate */
>      if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
> -        waitLock->waitMask &= BITS_OFF[lockmode];
> +        waitLock->waitMask &= LOCKBIT_OFF(lockmode);
>
>      /* Clean up the proc's own state */
>      proc->waitLock = NULL;
> @@ -968,7 +945,7 @@
>  }
>
>  /*
> - * LockRelease -- look up 'locktag' in lock table 'lockmethod' and
> + * LockRelease -- look up 'locktag' in lock table 'lockmethodid' and
>   *        release one 'lockmode' lock on it.
>   *
>   * Side Effects: find any waiting processes that are now wakable,
> @@ -978,27 +955,27 @@
>   *        come along and request the lock.)
>   */
>  bool
> -LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode)
>  {
>      LOCK       *lock;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      PROCLOCK   *proclock;
>      PROCLOCKTAG proclocktag;
>      HTAB       *proclockTable;
>      bool        wakeupNeeded = false;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
> +    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
>          elog(LOG, "LockRelease: user lock tag [%u] %d", locktag->objId.blkno, lockmode);
>  #endif
>
>      /* ???????? This must be changed when short term locks will be used */
> -    locktag->lockmethod = lockmethod;
> +    locktag->lockmethodid = lockmethodid;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
>          elog(WARNING, "lockMethodTable is null in LockRelease");
> @@ -1045,7 +1022,7 @@
>      {
>          LWLockRelease(masterLock);
>  #ifdef USER_LOCKS
> -        if (lockmethod == USER_LOCKMETHOD)
> +        if (lockmethodid == USER_LOCKMETHOD)
>              elog(WARNING, "no lock with this tag");
>          else
>  #endif
> @@ -1083,7 +1060,7 @@
>      if (lock->granted[lockmode] == 0)
>      {
>          /* change the conflict mask.  No more of this lock type. */
> -        lock->grantMask &= BITS_OFF[lockmode];
> +        lock->grantMask &= LOCKBIT_OFF(lockmode);
>      }
>
>      LOCK_PRINT("LockRelease: updated", lock, lockmode);
> @@ -1173,29 +1150,29 @@
>   * specified XID are released.
>   */
>  bool
> -LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
> +LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
>                 bool allxids, TransactionId xid)
>  {
>      SHM_QUEUE  *procHolders = &(proc->procHolders);
>      PROCLOCK   *proclock;
>      PROCLOCK   *nextHolder;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      int            i,
>                  numLockModes;
>      LOCK       *lock;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
> +    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
>          elog(LOG, "LockReleaseAll: lockmethod=%d, pid=%d",
> -             lockmethod, proc->pid);
> +             lockmethodid, proc->pid);
>  #endif
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
> -        elog(WARNING, "bad lock method: %d", lockmethod);
> +        elog(WARNING, "bad lock method: %d", lockmethodid);
>          return FALSE;
>      }
>
> @@ -1220,7 +1197,7 @@
>          lock = (LOCK *) MAKE_PTR(proclock->tag.lock);
>
>          /* Ignore items that are not of the lockmethod to be removed */
> -        if (LOCK_LOCKMETHOD(*lock) != lockmethod)
> +        if (LOCK_LOCKMETHOD(*lock) != lockmethodid)
>              goto next_item;
>
>          /* If not allxids, ignore items that are of the wrong xid */
> @@ -1249,7 +1226,7 @@
>                      lock->granted[i] -= proclock->holding[i];
>                      Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
>                      if (lock->granted[i] == 0)
> -                        lock->grantMask &= BITS_OFF[i];
> +                        lock->grantMask &= LOCKBIT_OFF(i);
>
>                      /*
>                       * Read comments in LockRelease
> @@ -1331,7 +1308,7 @@
>      LWLockRelease(masterLock);
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
> +    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
>          elog(LOG, "LockReleaseAll done");
>  #endif
>
> @@ -1346,7 +1323,7 @@
>
>      size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
>      size += maxBackends * MAXALIGN(sizeof(PGPROC));        /* each MyProc */
> -    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODTABLE));        /* each lockMethodTable */
> +    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LockMethodData));        /* each lock method */
>
>      /* lockHash table */
>      size += hash_estimate_size(max_table_size, sizeof(LOCK));
> @@ -1390,7 +1367,7 @@
>
>      LWLockAcquire(LockMgrLock, LW_EXCLUSIVE);
>
> -    proclockTable = LockMethodTable[DEFAULT_LOCKMETHOD]->proclockHash;
> +    proclockTable = LockMethods[DEFAULT_LOCKMETHOD]->proclockHash;
>
>      data->nelements = i = proclockTable->hctl->nentries;
>
> @@ -1446,8 +1423,8 @@
>      SHM_QUEUE  *procHolders;
>      PROCLOCK   *proclock;
>      LOCK       *lock;
> -    int            lockmethod = DEFAULT_LOCKMETHOD;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    int            lockmethodid = DEFAULT_LOCKMETHOD;
> +    LockMethod    lockMethodTable;
>
>      proc = MyProc;
>      if (proc == NULL)
> @@ -1455,8 +1432,8 @@
>
>      procHolders = &proc->procHolders;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>          return;
>
> @@ -1489,8 +1466,8 @@
>      PGPROC       *proc;
>      PROCLOCK   *proclock;
>      LOCK       *lock;
> -    int            lockmethod = DEFAULT_LOCKMETHOD;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    int            lockmethodid = DEFAULT_LOCKMETHOD;
> +    LockMethod    lockMethodTable;
>      HTAB       *proclockTable;
>      HASH_SEQ_STATUS status;
>
> @@ -1498,8 +1475,8 @@
>      if (proc == NULL)
>          return;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>          return;
>
> diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
> --- ../base/src/backend/storage/lmgr/proc.c    2003-08-04 04:40:03.000000000 +0200
> +++ src/backend/storage/lmgr/proc.c    2003-09-07 07:35:06.000000000 +0200
> @@ -524,14 +524,14 @@
>   * semaphore is normally zero, so when we try to acquire it, we sleep.
>   */
>  int
> -ProcSleep(LOCKMETHODTABLE *lockMethodTable,
> +ProcSleep(LockMethod lockMethodTable,
>            LOCKMODE lockmode,
>            LOCK *lock,
>            PROCLOCK *proclock)
>  {
>      LWLockId    masterLock = lockMethodTable->masterLock;
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
> -    int            myHeldLocks = MyProc->heldLocks;
> +    LOCKMASK    myHeldLocks = MyProc->heldLocks;
>      bool        early_deadlock = false;
>      PGPROC       *proc;
>      int            i;
> @@ -556,7 +556,7 @@
>       */
>      if (myHeldLocks != 0)
>      {
> -        int            aheadRequests = 0;
> +        LOCKMASK    aheadRequests = 0;
>
>          proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
>          for (i = 0; i < waitQueue->size; i++)
> @@ -596,7 +596,7 @@
>                  break;
>              }
>              /* Nope, so advance to next waiter */
> -            aheadRequests |= (1 << proc->waitLockMode);
> +            aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>
> @@ -618,7 +618,7 @@
>      SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
>      waitQueue->size++;
>
> -    lock->waitMask |= (1 << lockmode);
> +    lock->waitMask |= LOCKBIT_ON(lockmode);
>
>      /* Set up wait information in PGPROC object, too */
>      MyProc->waitLock = lock;
> @@ -750,12 +750,12 @@
>   *        for lock, waken any that are no longer blocked.
>   */
>  void
> -ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock)
> +ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
>  {
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
>      int            queue_size = waitQueue->size;
>      PGPROC       *proc;
> -    int            aheadRequests = 0;
> +    LOCKMASK    aheadRequests = 0;
>
>      Assert(queue_size >= 0);
>
> @@ -796,7 +796,7 @@
>               * Cannot wake this guy. Remember his request for later
>               * checks.
>               */
> -            aheadRequests |= (1 << lockmode);
> +            aheadRequests |= LOCKBIT_ON(lockmode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>      }
> diff -ruN ../base/src/include/storage/lmgr.h src/include/storage/lmgr.h
> --- ../base/src/include/storage/lmgr.h    2003-08-04 04:40:14.000000000 +0200
> +++ src/include/storage/lmgr.h    2003-09-06 18:02:43.000000000 +0200
> @@ -40,10 +40,7 @@
>   * so increase that if you want to add more modes.
>   */
>
> -extern LOCKMETHOD LockTableId;
> -
> -
> -extern LOCKMETHOD InitLockTable(int maxBackends);
> +extern void InitLockTable(int maxBackends);
>  extern void RelationInitLockInfo(Relation relation);
>
>  /* Lock a relation */
> diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
> --- ../base/src/include/storage/lock.h    2003-08-04 04:40:14.000000000 +0200
> +++ src/include/storage/lock.h    2003-09-07 07:25:13.000000000 +0200
> @@ -42,22 +42,23 @@
>
>
>  typedef int LOCKMASK;
> -
>  typedef int LOCKMODE;
> -typedef int LOCKMETHOD;
> -
>  /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
>  #define MAX_LOCKMODES        10
>
> +#define LOCKBIT_ON(lockmode) (1 << (lockmode))
> +#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
> +
> +typedef uint16 LOCKMETHODID;
>  /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
>  #define MAX_LOCK_METHODS    3
>
> -#define INVALID_TABLEID        0
> -
> -#define INVALID_LOCKMETHOD    INVALID_TABLEID
> +#define INVALID_LOCKMETHOD    0
>  #define DEFAULT_LOCKMETHOD    1
>  #define USER_LOCKMETHOD        2
>
> +#define LockMethodIsValid(lockmethodid) ((lockmethodid) != INVALID_LOCKMETHOD)
> +
>  /*
>   * There is normally only one lock method, the default one.
>   * If user locks are enabled, an additional lock method is present.
> @@ -83,15 +84,16 @@
>   * masterLock -- synchronizes access to the table
>   *
>   */
> -typedef struct LOCKMETHODTABLE
> +typedef struct LockMethodData
>  {
> -    HTAB       *lockHash;
> -    HTAB       *proclockHash;
> -    LOCKMETHOD    lockmethod;
> -    int            numLockModes;
> -    int            conflictTab[MAX_LOCKMODES];
> -    LWLockId    masterLock;
> -} LOCKMETHODTABLE;
> +    HTAB           *lockHash;
> +    HTAB           *proclockHash;
> +    LOCKMETHODID    lockmethodid;
> +    int                numLockModes;
> +    LOCKMASK        conflictTab[MAX_LOCKMODES];
> +    LWLockId        masterLock;
> +} LockMethodData;
> +typedef LockMethodData *LockMethod;
>
>
>  /*
> @@ -115,7 +117,7 @@
>       */
>      OffsetNumber offnum;
>
> -    uint16        lockmethod;        /* needed by userlocks */
> +    LOCKMETHODID lockmethodid;        /* needed by userlocks */
>  } LOCKTAG;
>
>
> @@ -139,8 +141,8 @@
>      LOCKTAG        tag;            /* unique identifier of lockable object */
>
>      /* data */
> -    int            grantMask;        /* bitmask for lock types already granted */
> -    int            waitMask;        /* bitmask for lock types awaited */
> +    LOCKMASK    grantMask;        /* bitmask for lock types already granted */
> +    LOCKMASK    waitMask;        /* bitmask for lock types awaited */
>      SHM_QUEUE    lockHolders;    /* list of PROCLOCK objects assoc. with
>                                   * lock */
>      PROC_QUEUE    waitProcs;        /* list of PGPROC objects waiting on lock */
> @@ -151,7 +153,7 @@
>      int            nGranted;        /* total of granted[] array */
>  } LOCK;
>
> -#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethod)
> +#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethodid)
>
>
>  /*
> @@ -204,7 +206,7 @@
>  } PROCLOCK;
>
>  #define PROCLOCK_LOCKMETHOD(proclock) \
> -        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethod)
> +        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethodid)
>
>  /*
>   * This struct holds information passed from lmgr internals to the lock
> @@ -227,17 +229,17 @@
>   * function prototypes
>   */
>  extern void InitLocks(void);
> -extern LOCKMETHODTABLE *GetLocksMethodTable(LOCK *lock);
> -extern LOCKMETHOD LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
> +extern LockMethod GetLocksMethodTable(LOCK *lock);
> +extern LOCKMETHODID LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
>                      int numModes, int maxBackends);
> -extern LOCKMETHOD LockMethodTableRename(LOCKMETHOD lockmethod);
> -extern bool LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +extern LOCKMETHODID LockMethodTableRename(LOCKMETHODID lockmethodid);
> +extern bool LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode, bool dontWait);
> -extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +extern bool LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode);
> -extern bool LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
> +extern bool LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
>                 bool allxids, TransactionId xid);
> -extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
> +extern int LockCheckConflicts(LockMethod lockMethodTable,
>                     LOCKMODE lockmode,
>                     LOCK *lock, PROCLOCK *proclock, PGPROC *proc,
>                     int *myHolding);
> diff -ruN ../base/src/include/storage/proc.h src/include/storage/proc.h
> --- ../base/src/include/storage/proc.h    2003-08-04 04:40:15.000000000 +0200
> +++ src/include/storage/proc.h    2003-09-06 22:45:54.000000000 +0200
> @@ -101,10 +101,10 @@
>  extern void ProcReleaseLocks(bool isCommit);
>
>  extern void ProcQueueInit(PROC_QUEUE *queue);
> -extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
> +extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode,
>            LOCK *lock, PROCLOCK *proclock);
>  extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
> -extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
> +extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
>  extern bool LockWaitCancel(void);
>
>  extern void ProcWaitForSignal(void);

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Manfred Koizar
Date:
On Mon, 8 Sep 2003 13:02:11 -0400 (EDT), Bruce Momjian
<pgman@candle.pha.pa.us> wrote:
>
>Manfred, can I get a description for this patch?  Thanks.

Try to reduce confusion about what is a lock method identifier, a lock
method control structure, or a table of control structures.

. Use type LOCKMASK where an int is not a counter.

. Get rid of INVALID_TABLEID, use INVALID_LOCKMETHOD instead.

. Use INVALID_LOCKMETHOD instead of (LOCKMETHOD) NULL, because
  LOCKMETHOD is not a pointer.

. Define and use macro LockMethodIsValid.

. Rename LOCKMETHOD to LOCKMETHODID.

. Remove global variable LongTermTableId in lmgr.c, because it is
  never used.

. Make LockTableId static in lmgr.c, because it is used nowhere else.
  Why not remove it and use DEFAULT_LOCKMETHOD?

. Rename the lock method control structure from LOCKMETHODTABLE to
  LockMethodData.  Introduce a pointer type named LockMethod.

. Remove elog(FATAL) after InitLockTable() call in
  CreateSharedMemoryAndSemaphores(), because if something goes wrong,
  there is elog(FATAL) in LockMethodTableInit(), and if this doesn't
  help, an elog(ERROR) in InitLockTable() is promoted to FATAL.

. Make InitLockTable() void, because its only caller does not use its
  return value any more.

. Rename variables in lock.c to avoid statements like
    LockMethodTable[NumLockMethods] = lockMethodTable;
    lockMethodTable = LockMethodTable[lockmethod];

. Change LOCKMETHODID type to uint16 to fit into struct LOCKTAG.

. Remove static variables BITS_OFF and BITS_ON from lock.c, because
  I agree to this doubt:
 * XXX is a fetch from a static array really faster than a shift?

. Define and use macros LOCKBIT_ON/OFF.

======================
 All 93 tests passed.
======================

Servus
 Manfred

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
This has been saved for the 7.5 release:

    http:/momjian.postgresql.org/cgi-bin/pgpatches2

---------------------------------------------------------------------------

Manfred Koizar wrote:
> On Mon, 8 Sep 2003 13:02:11 -0400 (EDT), Bruce Momjian
> <pgman@candle.pha.pa.us> wrote:
> >
> >Manfred, can I get a description for this patch?  Thanks.
>
> Try to reduce confusion about what is a lock method identifier, a lock
> method control structure, or a table of control structures.
>
> . Use type LOCKMASK where an int is not a counter.
>
> . Get rid of INVALID_TABLEID, use INVALID_LOCKMETHOD instead.
>
> . Use INVALID_LOCKMETHOD instead of (LOCKMETHOD) NULL, because
>   LOCKMETHOD is not a pointer.
>
> . Define and use macro LockMethodIsValid.
>
> . Rename LOCKMETHOD to LOCKMETHODID.
>
> . Remove global variable LongTermTableId in lmgr.c, because it is
>   never used.
>
> . Make LockTableId static in lmgr.c, because it is used nowhere else.
>   Why not remove it and use DEFAULT_LOCKMETHOD?
>
> . Rename the lock method control structure from LOCKMETHODTABLE to
>   LockMethodData.  Introduce a pointer type named LockMethod.
>
> . Remove elog(FATAL) after InitLockTable() call in
>   CreateSharedMemoryAndSemaphores(), because if something goes wrong,
>   there is elog(FATAL) in LockMethodTableInit(), and if this doesn't
>   help, an elog(ERROR) in InitLockTable() is promoted to FATAL.
>
> . Make InitLockTable() void, because its only caller does not use its
>   return value any more.
>
> . Rename variables in lock.c to avoid statements like
>     LockMethodTable[NumLockMethods] = lockMethodTable;
>     lockMethodTable = LockMethodTable[lockmethod];
>
> . Change LOCKMETHODID type to uint16 to fit into struct LOCKTAG.
>
> . Remove static variables BITS_OFF and BITS_ON from lock.c, because
>   I agree to this doubt:
>  * XXX is a fetch from a static array really faster than a shift?
>
> . Define and use macros LOCKBIT_ON/OFF.
>
> ======================
>  All 93 tests passed.
> ======================
>
> Servus
>  Manfred
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------


Manfred Koizar wrote:
> On Mon, 8 Sep 2003 00:51:45 -0400 (EDT), Bruce Momjian
> <pgman@candle.pha.pa.us> wrote:
> >
> >This has been saved for the 7.5 release:
> >
> >    http:/momjian.postgresql.org/cgi-bin/pgpatches2
>
> Here is the combined patch.  Prior patches in this thread are hereby
> obsolete.
>
> Servus
>  Manfred

> diff -ruN ../base/src/backend/storage/ipc/ipci.c src/backend/storage/ipc/ipci.c
> --- ../base/src/backend/storage/ipc/ipci.c    2003-08-04 04:40:03.000000000 +0200
> +++ src/backend/storage/ipc/ipci.c    2003-09-06 16:53:54.000000000 +0200
> @@ -111,8 +111,7 @@
>       * Set up lock manager
>       */
>      InitLocks();
> -    if (InitLockTable(maxBackends) == INVALID_TABLEID)
> -        elog(FATAL, "could not create the lock table");
> +    InitLockTable(maxBackends);
>
>      /*
>       * Set up process table
> diff -ruN ../base/src/backend/storage/lmgr/deadlock.c src/backend/storage/lmgr/deadlock.c
> --- ../base/src/backend/storage/lmgr/deadlock.c    2003-08-08 23:42:00.000000000 +0200
> +++ src/backend/storage/lmgr/deadlock.c    2003-09-06 22:25:46.000000000 +0200
> @@ -428,7 +428,7 @@
>      LOCK       *lock;
>      PROCLOCK   *proclock;
>      SHM_QUEUE  *lockHolders;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      PROC_QUEUE *waitQueue;
>      int            queue_size;
>      int            conflictMask;
> diff -ruN ../base/src/backend/storage/lmgr/lmgr.c src/backend/storage/lmgr/lmgr.c
> --- ../base/src/backend/storage/lmgr/lmgr.c    2003-08-18 00:41:12.000000000 +0200
> +++ src/backend/storage/lmgr/lmgr.c    2003-09-06 18:10:48.000000000 +0200
> @@ -65,26 +65,24 @@
>
>  };
>
> -LOCKMETHOD    LockTableId = (LOCKMETHOD) NULL;
> -LOCKMETHOD    LongTermTableId = (LOCKMETHOD) NULL;
> +static    LOCKMETHODID    LockTableId = INVALID_LOCKMETHOD;
>
>  /*
>   * Create the lock table described by LockConflicts
>   */
> -LOCKMETHOD
> +void
>  InitLockTable(int maxBackends)
>  {
> -    int            lockmethod;
> +    LOCKMETHODID    LongTermTableId;
>
>      /* number of lock modes is lengthof()-1 because of dummy zero */
> -    lockmethod = LockMethodTableInit("LockTable",
> -                                     LockConflicts,
> -                                     lengthof(LockConflicts) - 1,
> -                                     maxBackends);
> -    LockTableId = lockmethod;
> -
> -    if (!(LockTableId))
> +    LockTableId = LockMethodTableInit("LockTable",
> +                                      LockConflicts,
> +                                      lengthof(LockConflicts) - 1,
> +                                      maxBackends);
> +    if (!LockMethodIsValid(LockTableId))
>          elog(ERROR, "could not initialize lock table");
> +    Assert(LockTableId == DEFAULT_LOCKMETHOD);
>
>  #ifdef USER_LOCKS
>
> @@ -92,11 +90,10 @@
>       * Allocate another tableId for long-term locks
>       */
>      LongTermTableId = LockMethodTableRename(LockTableId);
> -    if (!(LongTermTableId))
> +    if (!LockMethodIsValid(LongTermTableId))
>          elog(ERROR, "could not rename long-term lock table");
> +    Assert(LongTermTableId == USER_LOCKMETHOD);
>  #endif
> -
> -    return LockTableId;
>  }
>
>  /*
> diff -ruN ../base/src/backend/storage/lmgr/lock.c src/backend/storage/lmgr/lock.c
> --- ../base/src/backend/storage/lmgr/lock.c    2003-08-18 00:41:12.000000000 +0200
> +++ src/backend/storage/lmgr/lock.c    2003-09-07 07:53:16.000000000 +0200
> @@ -46,7 +46,7 @@
>  #define NLOCKENTS(maxBackends)    (max_locks_per_xact * (maxBackends))
>
>
> -static int WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
> +static int WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
>             LOCK *lock, PROCLOCK *proclock);
>  static void LockCountMyLocks(SHMEM_OFFSET lockOffset, PGPROC *proc,
>                   int *myHolding);
> @@ -111,7 +111,7 @@
>               "req(%d,%d,%d,%d,%d,%d,%d)=%d "
>               "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
>               where, MAKE_OFFSET(lock),
> -             lock->tag.lockmethod, lock->tag.relId, lock->tag.dbId,
> +             lock->tag.lockmethodid, lock->tag.relId, lock->tag.dbId,
>               lock->tag.objId.blkno, lock->grantMask,
>               lock->requested[1], lock->requested[2], lock->requested[3],
>               lock->requested[4], lock->requested[5], lock->requested[6],
> @@ -150,19 +150,9 @@
>
>
>  /*
> - * These are to simplify/speed up some bit arithmetic.
> - *
> - * XXX is a fetch from a static array really faster than a shift?
> - * Wouldn't bet on it...
> + * map from lock method id to the lock table structure
>   */
> -
> -static LOCKMASK BITS_OFF[MAX_LOCKMODES];
> -static LOCKMASK BITS_ON[MAX_LOCKMODES];
> -
> -/*
> - * map from lockmethod to the lock table structure
> - */
> -static LOCKMETHODTABLE *LockMethodTable[MAX_LOCK_METHODS];
> +static LockMethod LockMethods[MAX_LOCK_METHODS];
>
>  static int    NumLockMethods;
>
> @@ -173,28 +163,20 @@
>  void
>  InitLocks(void)
>  {
> -    int            i;
> -    int            bit;
> -
> -    bit = 1;
> -    for (i = 0; i < MAX_LOCKMODES; i++, bit <<= 1)
> -    {
> -        BITS_ON[i] = bit;
> -        BITS_OFF[i] = ~bit;
> -    }
> +    /* NOP */
>  }
>
>
>  /*
>   * Fetch the lock method table associated with a given lock
>   */
> -LOCKMETHODTABLE *
> +LockMethod
>  GetLocksMethodTable(LOCK *lock)
>  {
> -    LOCKMETHOD    lockmethod = LOCK_LOCKMETHOD(*lock);
> +    LOCKMETHODID    lockmethodid = LOCK_LOCKMETHOD(*lock);
>
> -    Assert(lockmethod > 0 && lockmethod < NumLockMethods);
> -    return LockMethodTable[lockmethod];
> +    Assert(0 < lockmethodid && lockmethodid < NumLockMethods);
> +    return LockMethods[lockmethodid];
>  }
>
>
> @@ -205,7 +187,7 @@
>   * Notes: just copying.  Should only be called once.
>   */
>  static void
> -LockMethodInit(LOCKMETHODTABLE *lockMethodTable,
> +LockMethodInit(LockMethod lockMethodTable,
>                 LOCKMASK *conflictsP,
>                 int numModes)
>  {
> @@ -226,13 +208,13 @@
>   * by the postmaster are inherited by each backend, so they must be in
>   * TopMemoryContext.
>   */
> -LOCKMETHOD
> +LOCKMETHODID
>  LockMethodTableInit(char *tabName,
>                      LOCKMASK *conflictsP,
>                      int numModes,
>                      int maxBackends)
>  {
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    newLockMethod;
>      char       *shmemName;
>      HASHCTL        info;
>      int            hash_flags;
> @@ -254,10 +236,10 @@
>
>      /* each lock table has a header in shared memory */
>      sprintf(shmemName, "%s (lock method table)", tabName);
> -    lockMethodTable = (LOCKMETHODTABLE *)
> -        ShmemInitStruct(shmemName, sizeof(LOCKMETHODTABLE), &found);
> +    newLockMethod = (LockMethod)
> +        ShmemInitStruct(shmemName, sizeof(LockMethodData), &found);
>
> -    if (!lockMethodTable)
> +    if (!newLockMethod)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
>
>      /*
> @@ -275,15 +257,15 @@
>       */
>      if (!found)
>      {
> -        MemSet(lockMethodTable, 0, sizeof(LOCKMETHODTABLE));
> -        lockMethodTable->masterLock = LockMgrLock;
> -        lockMethodTable->lockmethod = NumLockMethods;
> +        MemSet(newLockMethod, 0, sizeof(LockMethodData));
> +        newLockMethod->masterLock = LockMgrLock;
> +        newLockMethod->lockmethodid = NumLockMethods;
>      }
>
>      /*
>       * other modules refer to the lock table by a lockmethod ID
>       */
> -    LockMethodTable[NumLockMethods] = lockMethodTable;
> +    LockMethods[NumLockMethods] = newLockMethod;
>      NumLockMethods++;
>      Assert(NumLockMethods <= MAX_LOCK_METHODS);
>
> @@ -297,15 +279,15 @@
>      hash_flags = (HASH_ELEM | HASH_FUNCTION);
>
>      sprintf(shmemName, "%s (lock hash)", tabName);
> -    lockMethodTable->lockHash = ShmemInitHash(shmemName,
> -                                              init_table_size,
> -                                              max_table_size,
> -                                              &info,
> -                                              hash_flags);
> +    newLockMethod->lockHash = ShmemInitHash(shmemName,
> +                                            init_table_size,
> +                                            max_table_size,
> +                                            &info,
> +                                            hash_flags);
>
> -    if (!lockMethodTable->lockHash)
> +    if (!newLockMethod->lockHash)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
> -    Assert(lockMethodTable->lockHash->hash == tag_hash);
> +    Assert(newLockMethod->lockHash->hash == tag_hash);
>
>      /*
>       * allocate a hash table for PROCLOCK structs.    This is used to store
> @@ -317,23 +299,23 @@
>      hash_flags = (HASH_ELEM | HASH_FUNCTION);
>
>      sprintf(shmemName, "%s (proclock hash)", tabName);
> -    lockMethodTable->proclockHash = ShmemInitHash(shmemName,
> -                                                  init_table_size,
> -                                                  max_table_size,
> -                                                  &info,
> -                                                  hash_flags);
> +    newLockMethod->proclockHash = ShmemInitHash(shmemName,
> +                                                init_table_size,
> +                                                max_table_size,
> +                                                &info,
> +                                                hash_flags);
>
> -    if (!lockMethodTable->proclockHash)
> +    if (!newLockMethod->proclockHash)
>          elog(FATAL, "could not initialize lock table \"%s\"", tabName);
>
>      /* init data structures */
> -    LockMethodInit(lockMethodTable, conflictsP, numModes);
> +    LockMethodInit(newLockMethod, conflictsP, numModes);
>
>      LWLockRelease(LockMgrLock);
>
>      pfree(shmemName);
>
> -    return lockMethodTable->lockmethod;
> +    return newLockMethod->lockmethodid;
>  }
>
>  /*
> @@ -349,22 +331,22 @@
>   *        short term and long term locks, yet store them all in one hashtable.
>   */
>
> -LOCKMETHOD
> -LockMethodTableRename(LOCKMETHOD lockmethod)
> +LOCKMETHODID
> +LockMethodTableRename(LOCKMETHODID lockmethodid)
>  {
> -    LOCKMETHOD    newLockMethod;
> +    LOCKMETHODID    newLockMethodId;
>
>      if (NumLockMethods >= MAX_LOCK_METHODS)
>          return INVALID_LOCKMETHOD;
> -    if (LockMethodTable[lockmethod] == INVALID_LOCKMETHOD)
> +    if (LockMethods[lockmethodid] == INVALID_LOCKMETHOD)
>          return INVALID_LOCKMETHOD;
>
>      /* other modules refer to the lock table by a lockmethod ID */
> -    newLockMethod = NumLockMethods;
> +    newLockMethodId = NumLockMethods;
>      NumLockMethods++;
>
> -    LockMethodTable[newLockMethod] = LockMethodTable[lockmethod];
> -    return newLockMethod;
> +    LockMethods[newLockMethodId] = LockMethods[lockmethodid];
> +    return newLockMethodId;
>  }
>
>  /*
> @@ -412,7 +394,7 @@
>   *
>   *                                        normal lock        user lock
>   *
> - *        lockmethod                        1                2
> + *        lockmethodid                    1                2
>   *        tag.dbId                        database oid    database oid
>   *        tag.relId                        rel oid or 0    0
>   *        tag.objId                        block id        lock id2
> @@ -429,7 +411,7 @@
>   */
>
>  bool
> -LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode, bool dontWait)
>  {
>      PROCLOCK   *proclock;
> @@ -438,25 +420,25 @@
>      bool        found;
>      LOCK       *lock;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      int            status;
>      int            myHolding[MAX_LOCKMODES];
>      int            i;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
> +    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
>          elog(LOG, "LockAcquire: user lock [%u] %s",
>               locktag->objId.blkno, lock_mode_names[lockmode]);
>  #endif
>
>      /* ???????? This must be changed when short term locks will be used */
> -    locktag->lockmethod = lockmethod;
> +    locktag->lockmethodid = lockmethodid;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
> -        elog(WARNING, "bad lock table id: %d", lockmethod);
> +        elog(WARNING, "bad lock table id: %d", lockmethodid);
>          return FALSE;
>      }
>
> @@ -666,15 +648,12 @@
>           * Construct bitmask of locks this process holds on this object.
>           */
>          {
> -            int            heldLocks = 0;
> -            int            tmpMask;
> +            LOCKMASK        heldLocks = 0;
>
> -            for (i = 1, tmpMask = 2;
> -                 i <= lockMethodTable->numLockModes;
> -                 i++, tmpMask <<= 1)
> +            for (i = 1; i <= lockMethodTable->numLockModes; i++)
>              {
>                  if (myHolding[i] > 0)
> -                    heldLocks |= tmpMask;
> +                    heldLocks |= LOCKBIT_ON(i);
>              }
>              MyProc->heldLocks = heldLocks;
>          }
> @@ -682,7 +661,7 @@
>          /*
>           * Sleep till someone wakes me up.
>           */
> -        status = WaitOnLock(lockmethod, lockmode, lock, proclock);
> +        status = WaitOnLock(lockmethodid, lockmode, lock, proclock);
>
>          /*
>           * NOTE: do not do any material change of state between here and
> @@ -729,7 +708,7 @@
>   * known.  If NULL is passed then these values will be computed internally.
>   */
>  int
> -LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
> +LockCheckConflicts(LockMethod lockMethodTable,
>                     LOCKMODE lockmode,
>                     LOCK *lock,
>                     PROCLOCK *proclock,
> @@ -737,9 +716,8 @@
>                     int *myHolding)        /* myHolding[] array or NULL */
>  {
>      int            numLockModes = lockMethodTable->numLockModes;
> -    int            bitmask;
> -    int            i,
> -                tmpMask;
> +    LOCKMASK    bitmask;
> +    int            i;
>      int            localHolding[MAX_LOCKMODES];
>
>      /*
> @@ -772,11 +750,10 @@
>
>      /* Compute mask of lock types held by other processes */
>      bitmask = 0;
> -    tmpMask = 2;
> -    for (i = 1; i <= numLockModes; i++, tmpMask <<= 1)
> +    for (i = 1; i <= numLockModes; i++)
>      {
>          if (lock->granted[i] != myHolding[i])
> -            bitmask |= tmpMask;
> +            bitmask |= LOCKBIT_ON(i);
>      }
>
>      /*
> @@ -842,9 +819,9 @@
>  {
>      lock->nGranted++;
>      lock->granted[lockmode]++;
> -    lock->grantMask |= BITS_ON[lockmode];
> +    lock->grantMask |= LOCKBIT_ON(lockmode);
>      if (lock->granted[lockmode] == lock->requested[lockmode])
> -        lock->waitMask &= BITS_OFF[lockmode];
> +        lock->waitMask &= LOCKBIT_OFF(lockmode);
>      LOCK_PRINT("GrantLock", lock, lockmode);
>      Assert((lock->nGranted > 0) && (lock->granted[lockmode] > 0));
>      Assert(lock->nGranted <= lock->nRequested);
> @@ -862,14 +839,14 @@
>   * The locktable's masterLock must be held at entry.
>   */
>  static int
> -WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
> +WaitOnLock(LOCKMETHODID lockmethodid, LOCKMODE lockmode,
>             LOCK *lock, PROCLOCK *proclock)
>  {
> -    LOCKMETHODTABLE *lockMethodTable = LockMethodTable[lockmethod];
> +    LockMethod    lockMethodTable = LockMethods[lockmethodid];
>      char       *new_status,
>                 *old_status;
>
> -    Assert(lockmethod < NumLockMethods);
> +    Assert(lockmethodid < NumLockMethods);
>
>      LOCK_PRINT("WaitOnLock: sleeping on lock", lock, lockmode);
>
> @@ -957,7 +934,7 @@
>      waitLock->requested[lockmode]--;
>      /* don't forget to clear waitMask bit if appropriate */
>      if (waitLock->granted[lockmode] == waitLock->requested[lockmode])
> -        waitLock->waitMask &= BITS_OFF[lockmode];
> +        waitLock->waitMask &= LOCKBIT_OFF(lockmode);
>
>      /* Clean up the proc's own state */
>      proc->waitLock = NULL;
> @@ -968,7 +945,7 @@
>  }
>
>  /*
> - * LockRelease -- look up 'locktag' in lock table 'lockmethod' and
> + * LockRelease -- look up 'locktag' in lock table 'lockmethodid' and
>   *        release one 'lockmode' lock on it.
>   *
>   * Side Effects: find any waiting processes that are now wakable,
> @@ -978,27 +955,27 @@
>   *        come along and request the lock.)
>   */
>  bool
> -LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode)
>  {
>      LOCK       *lock;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      PROCLOCK   *proclock;
>      PROCLOCKTAG proclocktag;
>      HTAB       *proclockTable;
>      bool        wakeupNeeded = false;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD && Trace_userlocks)
> +    if (lockmethodid == USER_LOCKMETHOD && Trace_userlocks)
>          elog(LOG, "LockRelease: user lock tag [%u] %d", locktag->objId.blkno, lockmode);
>  #endif
>
>      /* ???????? This must be changed when short term locks will be used */
> -    locktag->lockmethod = lockmethod;
> +    locktag->lockmethodid = lockmethodid;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
>          elog(WARNING, "lockMethodTable is null in LockRelease");
> @@ -1045,7 +1022,7 @@
>      {
>          LWLockRelease(masterLock);
>  #ifdef USER_LOCKS
> -        if (lockmethod == USER_LOCKMETHOD)
> +        if (lockmethodid == USER_LOCKMETHOD)
>              elog(WARNING, "no lock with this tag");
>          else
>  #endif
> @@ -1083,7 +1060,7 @@
>      if (lock->granted[lockmode] == 0)
>      {
>          /* change the conflict mask.  No more of this lock type. */
> -        lock->grantMask &= BITS_OFF[lockmode];
> +        lock->grantMask &= LOCKBIT_OFF(lockmode);
>      }
>
>      LOCK_PRINT("LockRelease: updated", lock, lockmode);
> @@ -1173,29 +1150,29 @@
>   * specified XID are released.
>   */
>  bool
> -LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
> +LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
>                 bool allxids, TransactionId xid)
>  {
>      SHM_QUEUE  *procHolders = &(proc->procHolders);
>      PROCLOCK   *proclock;
>      PROCLOCK   *nextHolder;
>      LWLockId    masterLock;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    LockMethod    lockMethodTable;
>      int            i,
>                  numLockModes;
>      LOCK       *lock;
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
> +    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
>          elog(LOG, "LockReleaseAll: lockmethod=%d, pid=%d",
> -             lockmethod, proc->pid);
> +             lockmethodid, proc->pid);
>  #endif
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>      {
> -        elog(WARNING, "bad lock method: %d", lockmethod);
> +        elog(WARNING, "bad lock method: %d", lockmethodid);
>          return FALSE;
>      }
>
> @@ -1220,7 +1197,7 @@
>          lock = (LOCK *) MAKE_PTR(proclock->tag.lock);
>
>          /* Ignore items that are not of the lockmethod to be removed */
> -        if (LOCK_LOCKMETHOD(*lock) != lockmethod)
> +        if (LOCK_LOCKMETHOD(*lock) != lockmethodid)
>              goto next_item;
>
>          /* If not allxids, ignore items that are of the wrong xid */
> @@ -1249,7 +1226,7 @@
>                      lock->granted[i] -= proclock->holding[i];
>                      Assert(lock->requested[i] >= 0 && lock->granted[i] >= 0);
>                      if (lock->granted[i] == 0)
> -                        lock->grantMask &= BITS_OFF[i];
> +                        lock->grantMask &= LOCKBIT_OFF(i);
>
>                      /*
>                       * Read comments in LockRelease
> @@ -1331,7 +1308,7 @@
>      LWLockRelease(masterLock);
>
>  #ifdef LOCK_DEBUG
> -    if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
> +    if (lockmethodid == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)
>          elog(LOG, "LockReleaseAll done");
>  #endif
>
> @@ -1346,7 +1323,7 @@
>
>      size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
>      size += maxBackends * MAXALIGN(sizeof(PGPROC));        /* each MyProc */
> -    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LOCKMETHODTABLE));        /* each lockMethodTable */
> +    size += MAX_LOCK_METHODS * MAXALIGN(sizeof(LockMethodData));        /* each lock method */
>
>      /* lockHash table */
>      size += hash_estimate_size(max_table_size, sizeof(LOCK));
> @@ -1390,7 +1367,7 @@
>
>      LWLockAcquire(LockMgrLock, LW_EXCLUSIVE);
>
> -    proclockTable = LockMethodTable[DEFAULT_LOCKMETHOD]->proclockHash;
> +    proclockTable = LockMethods[DEFAULT_LOCKMETHOD]->proclockHash;
>
>      data->nelements = i = proclockTable->hctl->nentries;
>
> @@ -1446,8 +1423,8 @@
>      SHM_QUEUE  *procHolders;
>      PROCLOCK   *proclock;
>      LOCK       *lock;
> -    int            lockmethod = DEFAULT_LOCKMETHOD;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    int            lockmethodid = DEFAULT_LOCKMETHOD;
> +    LockMethod    lockMethodTable;
>
>      proc = MyProc;
>      if (proc == NULL)
> @@ -1455,8 +1432,8 @@
>
>      procHolders = &proc->procHolders;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>          return;
>
> @@ -1489,8 +1466,8 @@
>      PGPROC       *proc;
>      PROCLOCK   *proclock;
>      LOCK       *lock;
> -    int            lockmethod = DEFAULT_LOCKMETHOD;
> -    LOCKMETHODTABLE *lockMethodTable;
> +    int            lockmethodid = DEFAULT_LOCKMETHOD;
> +    LockMethod    lockMethodTable;
>      HTAB       *proclockTable;
>      HASH_SEQ_STATUS status;
>
> @@ -1498,8 +1475,8 @@
>      if (proc == NULL)
>          return;
>
> -    Assert(lockmethod < NumLockMethods);
> -    lockMethodTable = LockMethodTable[lockmethod];
> +    Assert(lockmethodid < NumLockMethods);
> +    lockMethodTable = LockMethods[lockmethodid];
>      if (!lockMethodTable)
>          return;
>
> diff -ruN ../base/src/backend/storage/lmgr/proc.c src/backend/storage/lmgr/proc.c
> --- ../base/src/backend/storage/lmgr/proc.c    2003-08-04 04:40:03.000000000 +0200
> +++ src/backend/storage/lmgr/proc.c    2003-09-07 07:35:06.000000000 +0200
> @@ -524,14 +524,14 @@
>   * semaphore is normally zero, so when we try to acquire it, we sleep.
>   */
>  int
> -ProcSleep(LOCKMETHODTABLE *lockMethodTable,
> +ProcSleep(LockMethod lockMethodTable,
>            LOCKMODE lockmode,
>            LOCK *lock,
>            PROCLOCK *proclock)
>  {
>      LWLockId    masterLock = lockMethodTable->masterLock;
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
> -    int            myHeldLocks = MyProc->heldLocks;
> +    LOCKMASK    myHeldLocks = MyProc->heldLocks;
>      bool        early_deadlock = false;
>      PGPROC       *proc;
>      int            i;
> @@ -556,7 +556,7 @@
>       */
>      if (myHeldLocks != 0)
>      {
> -        int            aheadRequests = 0;
> +        LOCKMASK    aheadRequests = 0;
>
>          proc = (PGPROC *) MAKE_PTR(waitQueue->links.next);
>          for (i = 0; i < waitQueue->size; i++)
> @@ -596,7 +596,7 @@
>                  break;
>              }
>              /* Nope, so advance to next waiter */
> -            aheadRequests |= (1 << proc->waitLockMode);
> +            aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>
> @@ -618,7 +618,7 @@
>      SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
>      waitQueue->size++;
>
> -    lock->waitMask |= (1 << lockmode);
> +    lock->waitMask |= LOCKBIT_ON(lockmode);
>
>      /* Set up wait information in PGPROC object, too */
>      MyProc->waitLock = lock;
> @@ -750,12 +750,12 @@
>   *        for lock, waken any that are no longer blocked.
>   */
>  void
> -ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock)
> +ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
>  {
>      PROC_QUEUE *waitQueue = &(lock->waitProcs);
>      int            queue_size = waitQueue->size;
>      PGPROC       *proc;
> -    int            aheadRequests = 0;
> +    LOCKMASK    aheadRequests = 0;
>
>      Assert(queue_size >= 0);
>
> @@ -796,7 +796,7 @@
>               * Cannot wake this guy. Remember his request for later
>               * checks.
>               */
> -            aheadRequests |= (1 << lockmode);
> +            aheadRequests |= LOCKBIT_ON(lockmode);
>              proc = (PGPROC *) MAKE_PTR(proc->links.next);
>          }
>      }
> diff -ruN ../base/src/include/storage/lmgr.h src/include/storage/lmgr.h
> --- ../base/src/include/storage/lmgr.h    2003-08-04 04:40:14.000000000 +0200
> +++ src/include/storage/lmgr.h    2003-09-06 18:02:43.000000000 +0200
> @@ -40,10 +40,7 @@
>   * so increase that if you want to add more modes.
>   */
>
> -extern LOCKMETHOD LockTableId;
> -
> -
> -extern LOCKMETHOD InitLockTable(int maxBackends);
> +extern void InitLockTable(int maxBackends);
>  extern void RelationInitLockInfo(Relation relation);
>
>  /* Lock a relation */
> diff -ruN ../base/src/include/storage/lock.h src/include/storage/lock.h
> --- ../base/src/include/storage/lock.h    2003-08-04 04:40:14.000000000 +0200
> +++ src/include/storage/lock.h    2003-09-07 07:25:13.000000000 +0200
> @@ -42,22 +42,23 @@
>
>
>  typedef int LOCKMASK;
> -
>  typedef int LOCKMODE;
> -typedef int LOCKMETHOD;
> -
>  /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */
>  #define MAX_LOCKMODES        10
>
> +#define LOCKBIT_ON(lockmode) (1 << (lockmode))
> +#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
> +
> +typedef uint16 LOCKMETHODID;
>  /* MAX_LOCK_METHODS is the number of distinct lock control tables allowed */
>  #define MAX_LOCK_METHODS    3
>
> -#define INVALID_TABLEID        0
> -
> -#define INVALID_LOCKMETHOD    INVALID_TABLEID
> +#define INVALID_LOCKMETHOD    0
>  #define DEFAULT_LOCKMETHOD    1
>  #define USER_LOCKMETHOD        2
>
> +#define LockMethodIsValid(lockmethodid) ((lockmethodid) != INVALID_LOCKMETHOD)
> +
>  /*
>   * There is normally only one lock method, the default one.
>   * If user locks are enabled, an additional lock method is present.
> @@ -83,15 +84,16 @@
>   * masterLock -- synchronizes access to the table
>   *
>   */
> -typedef struct LOCKMETHODTABLE
> +typedef struct LockMethodData
>  {
> -    HTAB       *lockHash;
> -    HTAB       *proclockHash;
> -    LOCKMETHOD    lockmethod;
> -    int            numLockModes;
> -    int            conflictTab[MAX_LOCKMODES];
> -    LWLockId    masterLock;
> -} LOCKMETHODTABLE;
> +    HTAB           *lockHash;
> +    HTAB           *proclockHash;
> +    LOCKMETHODID    lockmethodid;
> +    int                numLockModes;
> +    LOCKMASK        conflictTab[MAX_LOCKMODES];
> +    LWLockId        masterLock;
> +} LockMethodData;
> +typedef LockMethodData *LockMethod;
>
>
>  /*
> @@ -115,7 +117,7 @@
>       */
>      OffsetNumber offnum;
>
> -    uint16        lockmethod;        /* needed by userlocks */
> +    LOCKMETHODID lockmethodid;        /* needed by userlocks */
>  } LOCKTAG;
>
>
> @@ -139,8 +141,8 @@
>      LOCKTAG        tag;            /* unique identifier of lockable object */
>
>      /* data */
> -    int            grantMask;        /* bitmask for lock types already granted */
> -    int            waitMask;        /* bitmask for lock types awaited */
> +    LOCKMASK    grantMask;        /* bitmask for lock types already granted */
> +    LOCKMASK    waitMask;        /* bitmask for lock types awaited */
>      SHM_QUEUE    lockHolders;    /* list of PROCLOCK objects assoc. with
>                                   * lock */
>      PROC_QUEUE    waitProcs;        /* list of PGPROC objects waiting on lock */
> @@ -151,7 +153,7 @@
>      int            nGranted;        /* total of granted[] array */
>  } LOCK;
>
> -#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethod)
> +#define LOCK_LOCKMETHOD(lock) ((lock).tag.lockmethodid)
>
>
>  /*
> @@ -204,7 +206,7 @@
>  } PROCLOCK;
>
>  #define PROCLOCK_LOCKMETHOD(proclock) \
> -        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethod)
> +        (((LOCK *) MAKE_PTR((proclock).tag.lock))->tag.lockmethodid)
>
>  /*
>   * This struct holds information passed from lmgr internals to the lock
> @@ -227,17 +229,17 @@
>   * function prototypes
>   */
>  extern void InitLocks(void);
> -extern LOCKMETHODTABLE *GetLocksMethodTable(LOCK *lock);
> -extern LOCKMETHOD LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
> +extern LockMethod GetLocksMethodTable(LOCK *lock);
> +extern LOCKMETHODID LockMethodTableInit(char *tabName, LOCKMASK *conflictsP,
>                      int numModes, int maxBackends);
> -extern LOCKMETHOD LockMethodTableRename(LOCKMETHOD lockmethod);
> -extern bool LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +extern LOCKMETHODID LockMethodTableRename(LOCKMETHODID lockmethodid);
> +extern bool LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode, bool dontWait);
> -extern bool LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
> +extern bool LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
>              TransactionId xid, LOCKMODE lockmode);
> -extern bool LockReleaseAll(LOCKMETHOD lockmethod, PGPROC *proc,
> +extern bool LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
>                 bool allxids, TransactionId xid);
> -extern int LockCheckConflicts(LOCKMETHODTABLE *lockMethodTable,
> +extern int LockCheckConflicts(LockMethod lockMethodTable,
>                     LOCKMODE lockmode,
>                     LOCK *lock, PROCLOCK *proclock, PGPROC *proc,
>                     int *myHolding);
> diff -ruN ../base/src/include/storage/proc.h src/include/storage/proc.h
> --- ../base/src/include/storage/proc.h    2003-08-04 04:40:15.000000000 +0200
> +++ src/include/storage/proc.h    2003-09-06 22:45:54.000000000 +0200
> @@ -101,10 +101,10 @@
>  extern void ProcReleaseLocks(bool isCommit);
>
>  extern void ProcQueueInit(PROC_QUEUE *queue);
> -extern int ProcSleep(LOCKMETHODTABLE *lockMethodTable, LOCKMODE lockmode,
> +extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode,
>            LOCK *lock, PROCLOCK *proclock);
>  extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
> -extern void ProcLockWakeup(LOCKMETHODTABLE *lockMethodTable, LOCK *lock);
> +extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
>  extern bool LockWaitCancel(void);
>
>  extern void ProcWaitForSignal(void);

>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Minor lmgr code cleanup

From
Bruce Momjian
Date:
Patch applied.  Thanks.  That lock manager code really needed the cleanup.

---------------------------------------------------------------------------


Manfred Koizar wrote:
> On Mon, 8 Sep 2003 13:02:11 -0400 (EDT), Bruce Momjian
> <pgman@candle.pha.pa.us> wrote:
> >
> >Manfred, can I get a description for this patch?  Thanks.
>
> Try to reduce confusion about what is a lock method identifier, a lock
> method control structure, or a table of control structures.
>
> . Use type LOCKMASK where an int is not a counter.
>
> . Get rid of INVALID_TABLEID, use INVALID_LOCKMETHOD instead.
>
> . Use INVALID_LOCKMETHOD instead of (LOCKMETHOD) NULL, because
>   LOCKMETHOD is not a pointer.
>
> . Define and use macro LockMethodIsValid.
>
> . Rename LOCKMETHOD to LOCKMETHODID.
>
> . Remove global variable LongTermTableId in lmgr.c, because it is
>   never used.
>
> . Make LockTableId static in lmgr.c, because it is used nowhere else.
>   Why not remove it and use DEFAULT_LOCKMETHOD?
>
> . Rename the lock method control structure from LOCKMETHODTABLE to
>   LockMethodData.  Introduce a pointer type named LockMethod.
>
> . Remove elog(FATAL) after InitLockTable() call in
>   CreateSharedMemoryAndSemaphores(), because if something goes wrong,
>   there is elog(FATAL) in LockMethodTableInit(), and if this doesn't
>   help, an elog(ERROR) in InitLockTable() is promoted to FATAL.
>
> . Make InitLockTable() void, because its only caller does not use its
>   return value any more.
>
> . Rename variables in lock.c to avoid statements like
>     LockMethodTable[NumLockMethods] = lockMethodTable;
>     lockMethodTable = LockMethodTable[lockmethod];
>
> . Change LOCKMETHODID type to uint16 to fit into struct LOCKTAG.
>
> . Remove static variables BITS_OFF and BITS_ON from lock.c, because
>   I agree to this doubt:
>  * XXX is a fetch from a static array really faster than a shift?
>
> . Define and use macros LOCKBIT_ON/OFF.
>
> ======================
>  All 93 tests passed.
> ======================
>
> Servus
>  Manfred
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073