summaryrefslogtreecommitdiff
path: root/src/backend/storage/lmgr/lock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/lmgr/lock.c')
-rw-r--r--src/backend/storage/lmgr/lock.c72
1 files changed, 31 insertions, 41 deletions
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 3fc31ed6a2..b3221db2a0 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.95 2001/09/27 16:29:12 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.96 2001/09/29 04:02:24 tgl Exp $
*
* NOTES
* Outside modules can create a lock table and acquire/release
@@ -78,8 +78,8 @@ static char *lock_mode_names[] =
* TRACE_LOCK_TABLE -- trace locks on this table (oid) unconditionally
* DEBUG_DEADLOCKS -- currently dumps locks at untimely occasions ;)
*
- * Furthermore, but in storage/ipc/spin.c:
- * TRACE_SPINLOCKS -- trace spinlocks (pretty useless)
+ * Furthermore, but in storage/lmgr/lwlock.c:
+ * TRACE_LWLOCKS -- trace lightweight locks (pretty useless)
*
* Define LOCK_DEBUG at compile time to get all these enabled.
* --------
@@ -151,10 +151,6 @@ HOLDER_PRINT(const char *where, const HOLDER *holderP)
#endif /* not LOCK_DEBUG */
-
-SPINLOCK LockMgrLock; /* in Shmem or created in
- * CreateSpinlocks() */
-
/*
* These are to simplify/speed up some bit arithmetic.
*
@@ -230,12 +226,6 @@ LockMethodInit(LOCKMETHODTABLE *lockMethodTable,
/*
* LockMethodTableInit -- initialize a lock table structure
*
- * Notes:
- * (a) a lock table has four separate entries in the shmem index
- * table. This is because every shared hash table and spinlock
- * has its name stored in the shmem index at its creation. It
- * is wasteful, in this case, but not much space is involved.
- *
* NOTE: data structures allocated here are allocated permanently, using
* TopMemoryContext and shared memory. We don't ever release them anyway,
* and in normal multi-backend operation the lock table structures set up
@@ -277,9 +267,9 @@ LockMethodTableInit(char *tabName,
MemoryContextAlloc(TopMemoryContext, sizeof(LOCKMETHODTABLE));
/*
- * find/acquire the spinlock for the table
+ * Lock the LWLock for the table (probably not necessary here)
*/
- SpinAcquire(LockMgrLock);
+ LWLockAcquire(LockMgrLock, LW_EXCLUSIVE);
/*
* allocate a control structure from shared memory or attach to it if
@@ -356,7 +346,7 @@ LockMethodTableInit(char *tabName,
/* init ctl data structures */
LockMethodInit(lockMethodTable, conflictsP, prioP, numModes);
- SpinRelease(LockMgrLock);
+ LWLockRelease(LockMgrLock);
pfree(shmemName);
@@ -464,7 +454,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
HTAB *holderTable;
bool found;
LOCK *lock;
- SPINLOCK masterLock;
+ LWLockId masterLock;
LOCKMETHODTABLE *lockMethodTable;
int status;
int myHolding[MAX_LOCKMODES];
@@ -489,7 +479,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
masterLock = lockMethodTable->ctl->masterLock;
- SpinAcquire(masterLock);
+ LWLockAcquire(masterLock, LW_EXCLUSIVE);
/*
* Find or create a lock with this tag
@@ -499,7 +489,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
HASH_ENTER, &found);
if (!lock)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(FATAL, "LockAcquire: lock table %d is corrupted", lockmethod);
return FALSE;
}
@@ -544,7 +534,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
HASH_ENTER, &found);
if (!holder)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(FATAL, "LockAcquire: holder table corrupted");
return FALSE;
}
@@ -617,7 +607,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
{
GrantLock(lock, holder, lockmode);
HOLDER_PRINT("LockAcquire: owning", holder);
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
return TRUE;
}
@@ -630,7 +620,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
{
GrantLock(lock, holder, lockmode);
HOLDER_PRINT("LockAcquire: my other XID owning", holder);
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
return TRUE;
}
@@ -677,7 +667,7 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
LOCK_PRINT("LockAcquire: conditional lock failed", lock, lockmode);
Assert((lock->nRequested > 0) && (lock->requested[lockmode] >= 0));
Assert(lock->nGranted <= lock->nRequested);
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
return FALSE;
}
@@ -719,14 +709,14 @@ LockAcquire(LOCKMETHOD lockmethod, LOCKTAG *locktag,
HOLDER_PRINT("LockAcquire: INCONSISTENT", holder);
LOCK_PRINT("LockAcquire: INCONSISTENT", lock, lockmode);
/* Should we retry ? */
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
return FALSE;
}
HOLDER_PRINT("LockAcquire: granted", holder);
LOCK_PRINT("LockAcquire: granted", lock, lockmode);
}
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
return status == STATUS_OK;
}
@@ -879,7 +869,7 @@ GrantLock(LOCK *lock, HOLDER *holder, LOCKMODE lockmode)
* Caller must have set MyProc->heldLocks to reflect locks already held
* on the lockable object by this process (under all XIDs).
*
- * The locktable spinlock must be held at entry.
+ * The locktable's masterLock must be held at entry.
*/
static int
WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
@@ -925,7 +915,7 @@ WaitOnLock(LOCKMETHOD lockmethod, LOCKMODE lockmode,
* needed, will happen in xact cleanup (see above for motivation).
*/
LOCK_PRINT("WaitOnLock: aborting on lock", lock, lockmode);
- SpinRelease(lockMethodTable->ctl->masterLock);
+ LWLockRelease(lockMethodTable->ctl->masterLock);
elog(ERROR, "deadlock detected");
/* not reached */
}
@@ -998,7 +988,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
TransactionId xid, LOCKMODE lockmode)
{
LOCK *lock;
- SPINLOCK masterLock;
+ LWLockId masterLock;
bool found;
LOCKMETHODTABLE *lockMethodTable;
HOLDER *holder;
@@ -1023,7 +1013,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
}
masterLock = lockMethodTable->ctl->masterLock;
- SpinAcquire(masterLock);
+ LWLockAcquire(masterLock, LW_EXCLUSIVE);
/*
* Find a lock with this tag
@@ -1038,14 +1028,14 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
*/
if (!lock)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockRelease: locktable corrupted");
return FALSE;
}
if (!found)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockRelease: no such lock");
return FALSE;
}
@@ -1065,7 +1055,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
HASH_FIND_SAVE, &found);
if (!holder || !found)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
#ifdef USER_LOCKS
if (!found && lockmethod == USER_LOCKMETHOD)
elog(NOTICE, "LockRelease: no lock with this tag");
@@ -1084,7 +1074,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
{
HOLDER_PRINT("LockRelease: WRONGTYPE", holder);
Assert(holder->holding[lockmode] >= 0);
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockRelease: you don't own a lock of type %s",
lock_mode_names[lockmode]);
return FALSE;
@@ -1139,7 +1129,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
&found);
if (!lock || !found)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockRelease: remove lock, table corrupted");
return FALSE;
}
@@ -1167,7 +1157,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
HASH_REMOVE_SAVED, &found);
if (!holder || !found)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockRelease: remove holder, table corrupted");
return FALSE;
}
@@ -1179,7 +1169,7 @@ LockRelease(LOCKMETHOD lockmethod, LOCKTAG *locktag,
if (wakeupNeeded)
ProcLockWakeup(lockMethodTable, lock);
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
return TRUE;
}
@@ -1201,7 +1191,7 @@ LockReleaseAll(LOCKMETHOD lockmethod, PROC *proc,
SHM_QUEUE *procHolders = &(proc->procHolders);
HOLDER *holder;
HOLDER *nextHolder;
- SPINLOCK masterLock;
+ LWLockId masterLock;
LOCKMETHODTABLE *lockMethodTable;
int i,
numLockModes;
@@ -1225,7 +1215,7 @@ LockReleaseAll(LOCKMETHOD lockmethod, PROC *proc,
numLockModes = lockMethodTable->ctl->numLockModes;
masterLock = lockMethodTable->ctl->masterLock;
- SpinAcquire(masterLock);
+ LWLockAcquire(masterLock, LW_EXCLUSIVE);
holder = (HOLDER *) SHMQueueNext(procHolders, procHolders,
offsetof(HOLDER, procLink));
@@ -1321,7 +1311,7 @@ LockReleaseAll(LOCKMETHOD lockmethod, PROC *proc,
&found);
if (!holder || !found)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockReleaseAll: holder table corrupted");
return FALSE;
}
@@ -1340,7 +1330,7 @@ LockReleaseAll(LOCKMETHOD lockmethod, PROC *proc,
HASH_REMOVE, &found);
if (!lock || !found)
{
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
elog(NOTICE, "LockReleaseAll: cannot remove lock from HTAB");
return FALSE;
}
@@ -1352,7 +1342,7 @@ next_item:
holder = nextHolder;
}
- SpinRelease(masterLock);
+ LWLockRelease(masterLock);
#ifdef LOCK_DEBUG
if (lockmethod == USER_LOCKMETHOD ? Trace_userlocks : Trace_locks)