package com.sleepycat.je.tree; import com.sleepycat.je.latch.Latch; import com.sleepycat.je.latch.LatchNotHeldException; import com.sleepycat.je.latch.LatchSupport; public class IN { private Latch latch; /** * Latch this node and set the generation. */ public void latch() throws DatabaseException { latch(true); } /** * Latch this node if it is not latched by another thread, and set the * generation if the latch succeeds. */ public boolean latchNoWait() throws DatabaseException { return latchNoWait(true); } /** * Release the latch on this node. */ public void releaseLatch() throws LatchNotHeldException { latch.release(); } /** * Release the latch on this node. */ public void releaseLatchIfOwner() throws LatchNotHeldException { latch.releaseIfOwner(); } /** * @return true if this thread holds the IN's latch */ public boolean isLatchOwner(){ return latch.isOwner(); } protected void hook618( EnvironmentImpl env){ latch=LatchSupport.makeLatch(shortClassName() + getNodeId(),env); original(env); } /** * Latch this node, optionally setting the generation. */ public void latch( boolean updateGeneration) throws DatabaseException { original(updateGeneration); latch.acquire(); } protected void hook619( boolean updateGeneration) throws DatabaseException { if (latch.acquireNoWait()) { original(updateGeneration); } else { throw new ReturnBoolean(false); } } /** * See if you are the parent of this child. If not, find a child of your's * that may be the parent, and return it. If there are no possiblities, * return null. Note that the keys of the target are passed in so we don't * have to latch the target to look at them. Also, this node is latched * upon entry. * @param doFetch If true, fetch the child in the pursuit of this search. * If false, give up if the child is not resident. In that case, we have * a potential ancestor, but are not sure if this is the parent. */ void findParent( Tree.SearchType searchType, long targetNodeId, boolean targetContainsDuplicates, boolean targetIsRoot, byte[] targetMainTreeKey, byte[] targetDupTreeKey, SearchResult result, boolean requireExactMatch, boolean updateGeneration, int targetLevel, List trackingList, boolean doFetch) throws DatabaseException { assert isLatchOwner(); original(searchType,targetNodeId,targetContainsDuplicates,targetIsRoot,targetMainTreeKey,targetDupTreeKey,result,requireExactMatch,updateGeneration,targetLevel,trackingList,doFetch); } protected void hook620() throws DatabaseException { releaseLatch(); original(); } protected void hook621() throws DatabaseException { releaseLatch(); original(); } protected void hook622() throws DatabaseException { releaseLatch(); original(); } protected void hook623() throws DatabaseException { releaseLatch(); original(); } protected void hook624() throws DatabaseException { releaseLatch(); original(); } protected void hook625( Node child) throws DatabaseException { ((IN)child).releaseLatch(); original(child); } protected void hook626() throws DatabaseException { releaseLatch(); original(); } protected void hook627() throws DatabaseException { releaseLatch(); original(); } /** * @see LogReadable#readFromLog */ public void readFromLog( ByteBuffer itemBuffer, byte entryTypeVersion) throws LogException { original(itemBuffer,entryTypeVersion); latch.setName(shortClassName() + getNodeId()); } @MethodObject static class IN_splitInternal { protected void hook630() throws DatabaseException { try { original(); } finally { newSibling.releaseLatch(); } } protected void hook631() throws DatabaseException { newSibling.latch(); original(); } } @MethodObject static class IN_isValidForDelete { protected void hook634() throws DatabaseException { needToLatch=!_this.isLatchOwner(); try { original(); } finally { if (needToLatch) { _this.releaseLatchIfOwner(); } } } protected void hook635() throws DatabaseException { if (needToLatch) { _this.latch(); } original(); } } @MethodObject static class IN_validateSubtreeBeforeDelete { protected void hook628() throws DatabaseException { needToLatch=!_this.isLatchOwner(); try { original(); } finally { if (needToLatch) { _this.releaseLatchIfOwner(); } } } protected void hook629() throws DatabaseException { if (needToLatch) { _this.latch(); } original(); } } @MethodObject static class IN_verify { void execute() throws DatabaseException { unlatchThis=false; original(); } protected void hook632() throws DatabaseException { if (!_this.isLatchOwner()) { _this.latch(); unlatchThis=true; } original(); } protected void hook633() throws DatabaseException { if (unlatchThis) { _this.releaseLatch(); } original(); } } }