/** * @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 */ 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, 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(); } }
/** * 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; } }
/** * @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) { long 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) { long 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 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) { long page = node.mPage; int pos = node.undoTop(); if (pos < pageSize(page)) { byte op = p_byteGet(page, pos); 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(); } }