package com.sleepycat.je.txn; import de.ovgu.cide.jakutil.*; /** * LockUpgrade is a type safe enumeration of lock upgrade types. Methods on * LockUpgrade objects are used to determine whether an upgrade is needed and, * if so, how it should be handled. */ class LockUpgrade { static final LockUpgrade ILLEGAL=new LockUpgrade(null,false,true); static final LockUpgrade EXISTING=new LockUpgrade(null,false,false); static final LockUpgrade WRITE_PROMOTE=new LockUpgrade(LockType.WRITE,true,false); static final LockUpgrade RANGE_READ_IMMED=new LockUpgrade(LockType.RANGE_READ,false,false); static final LockUpgrade RANGE_WRITE_IMMED=new LockUpgrade(LockType.RANGE_WRITE,false,false); static final LockUpgrade RANGE_WRITE_PROMOTE=new LockUpgrade(LockType.RANGE_WRITE,true,false); private LockType upgrade; private boolean promotion; private boolean illegal; /** * No upgrade types can be defined outside this class. */ private LockUpgrade( LockType upgrade, boolean promotion, boolean illegal){ this.upgrade=upgrade; this.promotion=promotion; this.illegal=illegal; } /** * This method is called to determine whether the upgrade is illegal. * If true is returned, an internal error has occurred. This should never * happen since RANGE_INSERT should never be requested along with other * locks by the same locker; a separate locker is used for RANGE_INSERT * locks. */ boolean getIllegal(){ return illegal; } /** * This method is called first to determine whether an upgrade to a new * lock type is needed, and what the new lock type should be. If null is * returned, the existing lock should be unchanged and no upgrade is * needed. If non-null is returned, an upgrade to the returned type should * be performed; in this case, call getPromotion to determine how to do the * upgrade. */ LockType getUpgrade(){ return upgrade; } /** * This method is called when getUpgrade returns non-null to determine * whether the upgrade is a true promotion or can be granted immediately. * A true promotion is a change from read to write locking, and may require * waiting if the write lock conflicts with a lock held by another locker. * An upgrade that is not a promotion is just a type change, and never * causes a lock conflict. */ boolean getPromotion(){ return promotion; } }