package com.sleepycat.je.txn; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.dbi.EnvironmentImpl; import de.ovgu.cide.jakutil.*; /** * Extends BasicLocker to share locks among all lockers for the same thread. * This locker is used when a JE entry point is called with a null transaction * parameter. */ public class ThreadLocker extends BasicLocker { /** * Creates a ThreadLocker. */ public ThreadLocker( EnvironmentImpl env) throws DatabaseException { super(env); } /** * Check that this txn is not used in the wrong thread. */ protected void checkState( boolean ignoreCalledByAbort) throws DatabaseException { if (thread != Thread.currentThread()) { throw new DatabaseException("A per-thread transaction was" + " created in " + thread + " but used in "+ Thread.currentThread()); } } /** * Creates a new instance of this txn for the same environment. No * transactional locks are held by this object, so no locks are retained. */ public Locker newNonTxnLocker() throws DatabaseException { checkState(false); return new ThreadLocker(envImpl); } /** * Returns whether this locker can share locks with the given locker. * Locks are shared when both are txns are ThreadLocker instances for the * same thread. */ public boolean sharesLocksWith( Locker other){ if (super.sharesLocksWith(other)) { return true; } else if (other instanceof ThreadLocker) { return thread == ((ThreadLocker)other).thread; } else { return false; } } }