package com.sleepycat.je.dbi; import com.sleepycat.je.latch.LatchNotHeldException; import com.sleepycat.je.latch.LatchSupport; public class CursorImpl { public void releaseBIN() throws LatchNotHeldException { if (bin != null) { bin.releaseLatchIfOwner(); } } public void latchBINs() throws DatabaseException { latchBIN(); latchDBIN(); } public void releaseBINs() throws LatchNotHeldException { releaseBIN(); releaseDBIN(); } public void releaseDBIN() throws LatchNotHeldException { if (dupBin != null) { dupBin.releaseLatchIfOwner(); } } private boolean checkAlreadyLatched( boolean alreadyLatched){ if (alreadyLatched) { if (dupBin != null) { return dupBin.isLatchOwner(); } else if (bin != null) { return bin.isLatchOwner(); } } return true; } protected void hook206() throws DatabaseException, CloneNotSupportedException { latchBINs(); original(); } protected void hook207() throws DatabaseException { releaseBINs(); original(); } protected void hook208( BIN bin){ assert bin.isLatchOwner(); original(bin); } protected void hook209( BIN abin) throws DatabaseException { abin.releaseLatch(); original(abin); } protected void hook210( DBIN abin) throws DatabaseException { abin.releaseLatch(); original(abin); } protected void hook211() throws DatabaseException { dupBin.releaseLatch(); original(); } protected void hook212( LockType lockType) throws DatabaseException { latchBIN(); try { original(lockType); } finally { releaseBIN(); } } protected void hook213( boolean isDup, LN ln, LockResult lockResult, LockResult dclLockResult, DIN dupRoot) throws DatabaseException { try { original(isDup,ln,lockResult,dclLockResult,dupRoot); } finally { if (dupRoot != null) { dupRoot.releaseLatchIfOwner(); } } } protected void hook214() throws DatabaseException { releaseBINs(); original(); } protected void hook215() throws DatabaseException { releaseBINs(); original(); } protected void hook216() throws DatabaseException { releaseBINs(); original(); } protected void hook217() throws DatabaseException { assert LatchSupport.countLatchesHeld() == 0; original(); } protected void hook218( DatabaseEntry data, DatabaseEntry foundKey, DatabaseEntry foundData, boolean isDup) throws DatabaseException { try { original(data,foundKey,foundData,isDup); } finally { releaseBINs(); } } protected void hook219() throws DatabaseException { latchBINs(); original(); } protected void hook220() throws DatabaseException { if (dupBin == null) { latchBIN(); } else { latchDBIN(); } original(); } protected void hook221( DatabaseEntry foundKey, DatabaseEntry foundData, LockType lockType, boolean first) throws DatabaseException { assert checkAlreadyLatched(true) : dumpToString(true); try { original(foundKey,foundData,lockType,first); } finally { releaseBINs(); } } protected void hook222() throws DatabaseException { latchBIN(); original(); } protected void hook223( LockType lockType) throws DatabaseException { try { original(lockType); } finally { releaseBINs(); } } protected void hook224( boolean alreadyLatched) throws DatabaseException { assert checkAlreadyLatched(alreadyLatched) : dumpToString(true); original(alreadyLatched); } protected boolean hook225( boolean alreadyLatched) throws DatabaseException { assert checkAlreadyLatched(alreadyLatched) : dumpToString(true); if (!alreadyLatched) { latchBIN(); } else { alreadyLatched=false; } return original(alreadyLatched); } protected boolean hook226( boolean alreadyLatched) throws DatabaseException { alreadyLatched=false; return original(alreadyLatched); } protected void hook227() throws DatabaseException { assert LatchSupport.countLatchesHeld() == 0; original(); } protected void hook228() throws DatabaseException { latchBIN(); original(); } protected void hook229() throws DatabaseException { releaseBIN(); original(); } protected void hook230( boolean alreadyLatched) throws DatabaseException { alreadyLatched=true; original(alreadyLatched); } protected void hook231() throws DatabaseException { assert LatchSupport.countLatchesHeld() == 0 : LatchSupport.latchesHeldToString(); original(); } private void flushBINToBeRemoved() throws DatabaseException { binToBeRemoved.latch(); original(); } protected void hook232() throws DatabaseException { binToBeRemoved.releaseLatch(); original(); } private void flushDBINToBeRemoved() throws DatabaseException { dupBinToBeRemoved.latch(); original(); } protected void hook233() throws DatabaseException { dupBinToBeRemoved.releaseLatch(); original(); } protected void hook234( boolean first, DIN duplicateRoot, IN in, boolean found) throws DatabaseException { try { original(first,duplicateRoot,in,found); } catch ( DatabaseException e) { if (in != null) { in.releaseLatch(); } throw e; } } protected void hook235( DatabaseEntry matchKey, DatabaseEntry matchData, SearchMode searchMode, LockType lockType, boolean foundSomething, boolean foundExactKey, boolean foundExactData, boolean foundLast, boolean exactSearch, BINBoundary binBoundary) throws DatabaseException { try { original(matchKey,matchData,searchMode,lockType,foundSomething,foundExactKey,foundExactData,foundLast,exactSearch,binBoundary); } catch ( DatabaseException e) { releaseBIN(); throw e; } } protected void hook236( DIN duplicateRoot) throws DatabaseException { duplicateRoot.latch(); releaseBIN(); original(duplicateRoot); } protected void hook237() throws DatabaseException { latchBINs(); original(); } protected void hook238() throws DatabaseException { releaseBINs(); original(); } protected void hook239( DIN dupRoot) throws DatabaseException { dupRoot.latch(); latchDBIN(); original(dupRoot); } protected void hook240() throws DatabaseException { latchBIN(); original(); } protected void hook241( DIN dupRoot) throws DatabaseException { dupRoot.releaseLatch(); releaseBINs(); original(dupRoot); } protected void hook242( boolean isDBINLatched, DIN dupRoot) throws DatabaseException { if (isDBINLatched) { if (!dupRoot.latchNoWait()) { releaseDBIN(); dupRoot.latch(); latchDBIN(); } } else { dupRoot.latch(); } original(isDBINLatched,dupRoot); } protected void hook243() throws DatabaseException { assert bin.isLatchOwner(); original(); } protected void hook264( DIN dupRoot) throws DatabaseException { dupRoot.releaseLatch(); original(dupRoot); } protected void hook265( DIN dupRoot) throws DatabaseException { dupRoot.latch(); releaseBIN(); original(dupRoot); } protected void hook266() throws DatabaseException { releaseBINs(); original(); } protected void hook267() throws DatabaseException { releaseBIN(); original(); } protected void hook268( DIN dupRoot) throws DatabaseException { dupRoot.releaseLatch(); original(dupRoot); } protected void hook269() throws DatabaseException { releaseBINs(); original(); } protected void hook270() throws DatabaseException { releaseBINs(); original(); } protected void hook271() throws DatabaseException { releaseBINs(); original(); } protected void hook272() throws DatabaseException { assert checkAlreadyLatched(true) : dumpToString(true); original(); } protected void hook273() throws DatabaseException { releaseBIN(); original(); } protected void hook274( IN in, DIN dupRoot) throws DatabaseException { dupRoot.latch(); in.releaseLatch(); original(in,dupRoot); } @MethodObject static class CursorImpl_latchBIN { protected void hook244() throws DatabaseException { while (_this.bin != null) { original(); } throw new ReturnObject(null); } protected void hook245() throws DatabaseException { waitingOn=_this.bin; waitingOn.latch(); if (_this.bin == waitingOn) { original(); } waitingOn.releaseLatch(); } } @MethodObject static class CursorImpl_getNextDuplicate { protected void hook250() throws DatabaseException { assert _this.checkAlreadyLatched(alreadyLatched) : _this.dumpToString(true); original(); } protected void hook251() throws DatabaseException { if (!alreadyLatched) { _this.latchDBIN(); } else { alreadyLatched=false; } original(); } protected void hook252() throws DatabaseException { _this.releaseDBIN(); original(); } protected void hook253() throws DatabaseException { assert LatchSupport.countLatchesHeld() == 0; original(); } protected void hook254() throws DatabaseException { assert (LatchSupport.countLatchesHeld() == 0); _this.dupBinToBeRemoved.latch(); original(); } protected void hook255() throws DatabaseException { _this.dupBinToBeRemoved.releaseLatch(); original(); } protected void hook256() throws DatabaseException { alreadyLatched=true; original(); } protected void hook257() throws DatabaseException { assert LatchSupport.countLatchesHeld() == 0; original(); } } @MethodObject static class CursorImpl_lockNextKeyForInsert { protected void hook248() throws DatabaseException { latched=true; try { original(); } finally { if (latched) { _this.releaseBINs(); } } } protected void hook249() throws DatabaseException { latched=false; original(); } } @MethodObject static class CursorImpl_latchDBIN { protected void hook246() throws DatabaseException { while (_this.dupBin != null) { original(); } throw new ReturnObject(null); } protected void hook247() throws DatabaseException { waitingOn=_this.dupBin; waitingOn.latch(); if (_this.dupBin == waitingOn) { original(); } waitingOn.releaseLatch(); } } @MethodObject static class CursorImpl_fetchCurrent { protected void hook258() throws DatabaseException { try { original(); } finally { _this.releaseBINs(); } } protected void hook259() throws DatabaseException { assert _this.targetBin.isLatchOwner(); original(); } protected void hook260() throws DatabaseException { try { original(); } catch ( DatabaseException DE) { _this.targetBin.releaseLatchIfOwner(); throw DE; } } protected void hook261() throws DatabaseException { _this.targetBin.releaseLatchIfOwner(); original(); } protected void hook262() throws DatabaseException { duplicateRoot.latch(); _this.targetBin.releaseLatch(); original(); } protected void hook263() throws DatabaseException { try { original(); } catch ( DatabaseException DE) { _this.releaseBINs(); throw DE; } } } }