/** * @return sibling with exclusive latch held */ final Node latchSiblingEx() { Node sibling = mSibling; sibling.acquireExclusive(); return sibling; }
/** * @return sibling with exclusive latch held */ final Node latchSiblingEx() { Node sibling = mSibling; sibling.acquireExclusive(); return sibling; }
/** * @return sibling with exclusive latch held */ final Node latchSiblingEx() { Node sibling = mSibling; sibling.acquireExclusive(); return sibling; }
/** * 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 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; } }
/** * 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; }
/** * Must be called when object is no longer referenced. */ void delete(LocalDatabase db) { acquireExclusive(); try { doDelete(db); } finally { releaseExclusive(); } }
/** * 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 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; }
/** * @param delete true to delete empty nodes * @return last pushed op, or 0 if empty */ final byte peek(boolean delete) throws IOException { Node node = mNode; if (node == null) { return (mBuffer == null || mBufferPos >= mBuffer.length) ? 0 : mBuffer[mBufferPos]; } node.acquireExclusive(); while (true) { /*P*/ byte[] page = node.mPage; if (mNodeTopPos < pageSize(page)) { byte op = p_byteGet(page, mNodeTopPos); node.releaseExclusive(); return op; } if ((node = popNode(node, delete)) == null) { return 0; } } }
/** * @param delete true to delete empty nodes * @return last pushed op, or 0 if empty */ final byte peek(boolean delete) throws IOException { Node node = mNode; if (node == null) { return (mBuffer == null || mBufferPos >= mBuffer.length) ? 0 : mBuffer[mBufferPos]; } node.acquireExclusive(); while (true) { /*P*/ byte[] page = node.mPage; if (mNodeTopPos < pageSize(page)) { byte op = p_byteGet(page, mNodeTopPos); node.releaseExclusive(); return op; } if ((node = popNode(node, delete)) == null) { return 0; } } }
/** * Must be called after all entries in the tree have been deleted and tree is closed. */ void removeFromTrash(Tree tree, Node root) throws IOException { byte[] trashIdKey = newKey(KEY_TYPE_TRASH_ID, tree.mIdBytes); CommitLock.Shared shared = mCommitLock.acquireShared(); try { if (root != null) { root.acquireExclusive(); if (root.mPage == p_closedTreePage()) { // Database has been closed. root.releaseExclusive(); return; } deleteNode(root); } mRegistryKeyMap.delete(Transaction.BOGUS, trashIdKey); mRegistry.delete(Transaction.BOGUS, tree.mIdBytes); } catch (Throwable e) { throw closeOnFailure(this, e); } finally { shared.release(); } }
/** * Must be called after all entries in the tree have been deleted and tree is closed. */ void removeFromTrash(Tree tree, Node root) throws IOException { byte[] trashIdKey = newKey(KEY_TYPE_TRASH_ID, tree.mIdBytes); CommitLock.Shared shared = mCommitLock.acquireShared(); try { if (root != null) { root.acquireExclusive(); if (root.mPage == p_closedTreePage()) { // Database has been closed. root.releaseExclusive(); return; } deleteNode(root); } mRegistryKeyMap.delete(Transaction.BOGUS, trashIdKey); mRegistry.delete(Transaction.BOGUS, tree.mIdBytes); } catch (Throwable e) { throw closeOnFailure(this, e); } finally { shared.release(); } }