/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node */ final Node acquireExclusive() { Node node = mNode; while (true) { node.acquireExclusive(); Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } }
/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node */ final Node acquireExclusive() { Node node = mNode; while (true) { node.acquireExclusive(); Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } }
/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node, or null if not acquired */ final Node tryAcquireExclusive() { Node node = mNode; while (node.tryAcquireExclusive()) { Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } return null; }
/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node, or null if not acquired */ final Node tryAcquireExclusive() { Node node = mNode; while (node.tryAcquireExclusive()) { Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } return null; }
/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node, or null if not not bound */ final Node acquireExclusiveIfBound() { Node node = mNode; while (node != null) { node.acquireExclusive(); Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } return null; }
/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node, or null if not not bound */ final Node acquireExclusiveIfBound() { Node node = mNode; while (node != null) { node.acquireExclusive(); Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } return null; }
/** * Acquire an exclusive latch on this frame's bound node. * * @return frame node */ final Node acquireExclusive() { Node node = mNode; while (true) { node.acquireExclusive(); Node actualNode = mNode; if (actualNode == node) { return actualNode; } node.releaseExclusive(); node = actualNode; } }
/** * Must be called when object is no longer referenced. */ void delete(LocalDatabase db) { acquireExclusive(); try { doDelete(db); } finally { releaseExclusive(); } }
static UndoLog recoverMasterUndoLog(LocalDatabase db, long nodeId) throws IOException { UndoLog log = new UndoLog(db, 0); // Length is not recoverable. log.mLength = Long.MAX_VALUE; (log.mNode = readUndoLogNode(db, nodeId)).releaseExclusive(); return log; }
/** * Must be called when object is no longer referenced. */ void delete(LocalDatabase db) { acquireExclusive(); try { doDelete(db); } finally { releaseExclusive(); } }
private Node latchRootDirty(Tree tree) throws IOException { Node root = tree.mRoot; root.acquireExclusive(); try { mDatabase.markDirty(tree, root); return root; } catch (Throwable e) { root.releaseExclusive(); throw e; } }
/** * Must be called when object is no longer referenced. */ void delete(LocalDatabase db) { acquireExclusive(); try { doDelete(db); } finally { releaseExclusive(); } }
/** * @return exclusively latched node if found; null if not found */ Node nodeMapGetExclusive(long nodeId) { int hash = Long.hashCode(nodeId); while (true) { Node node = nodeMapGet(nodeId, hash); if (node == null) { return null; } node.acquireExclusive(); if (nodeId == node.mId) { return node; } node.releaseExclusive(); } }
/** * @return exclusively latched node if found; null if not found */ Node nodeMapGetAndRemove(long nodeId) { int hash = Long.hashCode(nodeId); Node node = nodeMapGet(nodeId, hash); if (node != null) { node.acquireExclusive(); if (nodeId != node.mId) { node.releaseExclusive(); node = null; } else { nodeMapRemove(node, hash); } } return node; }
static UndoLog recoverMasterUndoLog(LocalDatabase db, long nodeId) throws IOException { UndoLog log = new UndoLog(db, 0); // Length is not recoverable. log.mLength = Long.MAX_VALUE; log.mNode = readUndoLogNode(db, nodeId); log.mNodeTopPos = log.mNode.undoTop(); log.mNode.releaseExclusive(); return log; }
static UndoLog recoverMasterUndoLog(LocalDatabase db, long nodeId) throws IOException { UndoLog log = new UndoLog(db, 0); // Length is not recoverable. log.mLength = Long.MAX_VALUE; log.mNode = readUndoLogNode(db, nodeId); log.mNodeTopPos = log.mNode.undoTop(); log.mNode.releaseExclusive(); return log; }
/** * Initialize and preallocate a minimum amount of nodes. * * @param arena optional */ void initialize(Object arena, int min) throws DatabaseException, OutOfMemoryError { while (--min >= 0) { acquireExclusive(); if (mSize >= mMaxSize) { releaseExclusive(); break; } doAllocLatchedNode(arena, 0).releaseExclusive(); } }
/** * Initialize and preallocate a minimum amount of nodes. * * @param arena optional */ void initialize(Object arena, int min) throws DatabaseException, OutOfMemoryError { while (--min >= 0) { acquireExclusive(); if (mSize >= mMaxSize) { releaseExclusive(); break; } doAllocLatchedNode(arena, 0).releaseExclusive(); } }
/** * Initialize and preallocate a minimum amount of nodes. * * @param arena optional */ void initialize(Object arena, int min) throws DatabaseException, OutOfMemoryError { while (--min >= 0) { acquireExclusive(); if (mSize >= mMaxSize) { releaseExclusive(); break; } doAllocLatchedNode(arena, 0).releaseExclusive(); } }
@Override void doWrite(long pos, byte[] buf, int off, int len) throws IOException { // FIXME: txn undo/redo try { final CursorFrame leaf = mCursor.leafExclusive(); final CommitLock.Shared shared = mCursor.commitLock(leaf); try { mCursor.notSplitDirty(leaf); action(leaf, OP_WRITE, pos, buf, off, len); leaf.mNode.releaseExclusive(); } finally { shared.release(); } } catch (IllegalStateException e) { checkOpen(); throw e; } }