package com.sleepycat.je.txn; import java.util.Set; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.LockStats; import com.sleepycat.je.dbi.DatabaseImpl; import com.sleepycat.je.dbi.EnvironmentImpl; import com.sleepycat.je.dbi.MemoryBudget; import com.sleepycat.je.latch.Latch; import de.ovgu.cide.jakutil.*; /** * LatchedLockManager uses latches to implement its critical sections. */ public class LatchedLockManager extends LockManager { public LatchedLockManager( EnvironmentImpl envImpl) throws DatabaseException { super(envImpl); } /** * @see LockManager#attemptLock */ protected LockAttemptResult attemptLock( Long nodeId, Locker locker, LockType type, boolean nonBlockingRequest) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return attemptLockInternal(nodeId,locker,type,nonBlockingRequest,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#makeTimeoutMsg */ protected String makeTimeoutMsg( String lockOrTxn, Locker locker, long nodeId, LockType type, LockGrantType grantType, Lock useLock, long timeout, long start, long now, DatabaseImpl database) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return makeTimeoutMsgInternal(lockOrTxn,locker,nodeId,type,grantType,useLock,timeout,start,now,database); } finally { latch.release(); } } /** * @see LockManager#releaseAndNotifyTargets */ protected Set releaseAndFindNotifyTargets( long nodeId, Lock lock, Locker locker, boolean removeFromLocker) throws DatabaseException { long nid=nodeId; if (nid == -1) { nid=lock.getNodeId().longValue(); } int lockTableIndex=getLockTableIndex(nid); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return releaseAndFindNotifyTargetsInternal(nodeId,lock,locker,removeFromLocker,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#transfer */ void transfer( long nodeId, Locker owningLocker, Locker destLocker, boolean demoteToRead) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { transferInternal(nodeId,owningLocker,destLocker,demoteToRead,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#transferMultiple */ void transferMultiple( long nodeId, Locker owningLocker, Locker[] destLockers) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { transferMultipleInternal(nodeId,owningLocker,destLockers,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#demote */ void demote( long nodeId, Locker locker) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { demoteInternal(nodeId,locker,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#isLocked */ boolean isLocked( Long nodeId) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return isLockedInternal(nodeId,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#isOwner */ boolean isOwner( Long nodeId, Locker locker, LockType type) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return isOwnerInternal(nodeId,locker,type,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#isWaiter */ boolean isWaiter( Long nodeId, Locker locker) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return isWaiterInternal(nodeId,locker,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#nWaiters */ int nWaiters( Long nodeId) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return nWaitersInternal(nodeId,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#nOwners */ int nOwners( Long nodeId) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return nOwnersInternal(nodeId,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#getWriterOwnerLocker */ Locker getWriteOwnerLocker( Long nodeId) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return getWriteOwnerLockerInternal(nodeId,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#validateOwnership */ protected boolean validateOwnership( Long nodeId, Locker locker, LockType type, boolean flushFromWaiters, MemoryBudget mb) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); Latch latch=lockTableLatches[lockTableIndex]; latch.acquire(); try { return validateOwnershipInternal(nodeId,locker,type,flushFromWaiters,mb,lockTableIndex); } finally { latch.release(); } } /** * @see LockManager#dumpLockTable */ protected void dumpLockTable( LockStats stats) throws DatabaseException { for (int i=0; i < nLockTables; i++) { lockTableLatches[i].acquire(); try { dumpLockTableInternal(stats,i); } finally { lockTableLatches[i].release(); } } } }