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 de.ovgu.cide.jakutil.*; /** * SyncedLockManager uses the synchronized keyword to implement its critical * sections. */ public class SyncedLockManager extends LockManager { public SyncedLockManager( EnvironmentImpl envImpl) throws DatabaseException { super(envImpl); } /** * @see LockManager#attemptLock */ protected LockAttemptResult attemptLock( Long nodeId, Locker locker, LockType type, boolean nonBlockingRequest) throws DatabaseException { try { int lockTableIndex=getLockTableIndex(nodeId); this.hook782(nodeId,locker,type,nonBlockingRequest,lockTableIndex); throw ReturnHack.returnObject; } catch ( ReturnObject r) { return (LockAttemptResult)r.value; } } /** * @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){ try { int lockTableIndex=getLockTableIndex(nodeId); this.hook783(lockOrTxn,locker,nodeId,type,grantType,useLock,timeout,start,now,database,lockTableIndex); throw ReturnHack.returnObject; } catch ( ReturnObject r) { return (String)r.value; } } /** * @see LockManager#releaseAndNotifyTargets */ protected Set releaseAndFindNotifyTargets( long nodeId, Lock lock, Locker locker, boolean removeFromLocker) throws DatabaseException { try { long nid=nodeId; if (nid == -1) { nid=lock.getNodeId().longValue(); } int lockTableIndex=getLockTableIndex(nid); this.hook784(nodeId,lock,locker,removeFromLocker,lockTableIndex); throw ReturnHack.returnObject; } catch ( ReturnObject r) { return (Set)r.value; } } /** * @see LockManager#transfer */ void transfer( long nodeId, Locker owningLocker, Locker destLocker, boolean demoteToRead) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); this.hook785(nodeId,owningLocker,destLocker,demoteToRead,lockTableIndex); } /** * @see LockManager#transferMultiple */ void transferMultiple( long nodeId, Locker owningLocker, Locker[] destLockers) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); this.hook786(nodeId,owningLocker,destLockers,lockTableIndex); } /** * @see LockManager#demote */ void demote( long nodeId, Locker locker) throws DatabaseException { int lockTableIndex=getLockTableIndex(nodeId); this.hook787(nodeId,locker,lockTableIndex); } /** * @see LockManager#isLocked */ boolean isLocked( Long nodeId){ try { int lockTableIndex=getLockTableIndex(nodeId); this.hook788(nodeId,lockTableIndex); throw ReturnHack.returnBoolean; } catch ( ReturnBoolean r) { return r.value; } } /** * @see LockManager#isOwner */ boolean isOwner( Long nodeId, Locker locker, LockType type){ try { int lockTableIndex=getLockTableIndex(nodeId); this.hook789(nodeId,locker,type,lockTableIndex); throw ReturnHack.returnBoolean; } catch ( ReturnBoolean r) { return r.value; } } /** * @see LockManager#isWaiter */ boolean isWaiter( Long nodeId, Locker locker){ try { int lockTableIndex=getLockTableIndex(nodeId); this.hook790(nodeId,locker,lockTableIndex); throw ReturnHack.returnBoolean; } catch ( ReturnBoolean r) { return r.value; } } /** * @see LockManager#nWaiters */ int nWaiters( Long nodeId){ try { int lockTableIndex=getLockTableIndex(nodeId); this.hook791(nodeId,lockTableIndex); throw ReturnHack.returnInt; } catch ( ReturnInt r) { return r.value; } } /** * @see LockManager#nOwners */ int nOwners( Long nodeId){ try { int lockTableIndex=getLockTableIndex(nodeId); this.hook792(nodeId,lockTableIndex); throw ReturnHack.returnInt; } catch ( ReturnInt r) { return r.value; } } /** * @see LockManager#getWriterOwnerLocker */ Locker getWriteOwnerLocker( Long nodeId) throws DatabaseException { try { int lockTableIndex=getLockTableIndex(nodeId); this.hook793(nodeId,lockTableIndex); throw ReturnHack.returnObject; } catch ( ReturnObject r) { return (Locker)r.value; } } /** * @see LockManager#validateOwnership */ protected boolean validateOwnership( Long nodeId, Locker locker, LockType type, boolean flushFromWaiters, MemoryBudget mb) throws DatabaseException { try { int lockTableIndex=getLockTableIndex(nodeId); this.hook794(nodeId,locker,type,flushFromWaiters,mb,lockTableIndex); throw ReturnHack.returnBoolean; } catch ( ReturnBoolean r) { return r.value; } } /** * @see LockManager#dumpLockTable */ protected void dumpLockTable( LockStats stats) throws DatabaseException { for (int i=0; i < nLockTables; i++) { this.hook795(stats,i); } } protected void hook782( Long nodeId, Locker locker, LockType type, boolean nonBlockingRequest, int lockTableIndex) throws DatabaseException { throw new ReturnObject(attemptLockInternal(nodeId,locker,type,nonBlockingRequest,lockTableIndex)); } protected void hook783( String lockOrTxn, Locker locker, long nodeId, LockType type, LockGrantType grantType, Lock useLock, long timeout, long start, long now, DatabaseImpl database, int lockTableIndex){ throw new ReturnObject(makeTimeoutMsgInternal(lockOrTxn,locker,nodeId,type,grantType,useLock,timeout,start,now,database)); } protected void hook784( long nodeId, Lock lock, Locker locker, boolean removeFromLocker, int lockTableIndex) throws DatabaseException { throw new ReturnObject(releaseAndFindNotifyTargetsInternal(nodeId,lock,locker,removeFromLocker,lockTableIndex)); } protected void hook785( long nodeId, Locker owningLocker, Locker destLocker, boolean demoteToRead, int lockTableIndex) throws DatabaseException { transferInternal(nodeId,owningLocker,destLocker,demoteToRead,lockTableIndex); } protected void hook786( long nodeId, Locker owningLocker, Locker[] destLockers, int lockTableIndex) throws DatabaseException { transferMultipleInternal(nodeId,owningLocker,destLockers,lockTableIndex); } protected void hook787( long nodeId, Locker locker, int lockTableIndex) throws DatabaseException { demoteInternal(nodeId,locker,lockTableIndex); } protected void hook788( Long nodeId, int lockTableIndex){ throw new ReturnBoolean(isLockedInternal(nodeId,lockTableIndex)); } protected void hook789( Long nodeId, Locker locker, LockType type, int lockTableIndex){ throw new ReturnBoolean(isOwnerInternal(nodeId,locker,type,lockTableIndex)); } protected void hook790( Long nodeId, Locker locker, int lockTableIndex){ throw new ReturnBoolean(isWaiterInternal(nodeId,locker,lockTableIndex)); } protected void hook791( Long nodeId, int lockTableIndex){ throw new ReturnInt(nWaitersInternal(nodeId,lockTableIndex)); } protected void hook792( Long nodeId, int lockTableIndex){ throw new ReturnInt(nOwnersInternal(nodeId,lockTableIndex)); } protected void hook793( Long nodeId, int lockTableIndex) throws DatabaseException { throw new ReturnObject(getWriteOwnerLockerInternal(nodeId,lockTableIndex)); } protected void hook794( Long nodeId, Locker locker, LockType type, boolean flushFromWaiters, MemoryBudget mb, int lockTableIndex) throws DatabaseException { throw new ReturnBoolean(validateOwnershipInternal(nodeId,locker,type,flushFromWaiters,mb,lockTableIndex)); } protected void hook795( LockStats stats, int i) throws DatabaseException { dumpLockTableInternal(stats,i); } }