/** * @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; } } }
/** * Ensures all entries are stored in persistable nodes. Caller must hold db * commit lock. */ private void persistReady() throws IOException { if (mNode != null) { return; } Node node; byte[] buffer = mBuffer; if (buffer == null) { mNode = node = allocUnevictableNode(0); // Set pointer to top entry (none at the moment). node.undoTop(pageSize(node.mPage)); node.releaseExclusive(); } else { mNode = node = allocUnevictableNode(0); int pos = mBufferPos; int size = buffer.length - pos; /*P*/ byte[] page = node.mPage; int newPos = pageSize(page) - size; p_copyFromArray(buffer, pos, page, newPos, size); // Set pointer to top entry. node.undoTop(newPos); mBuffer = null; mBufferPos = 0; node.releaseExclusive(); } }
/** * @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; } } }
while (true) { page = node.mPage; if (mNodeTopPos < pageSize(page)) { break; if (mNodeTopPos >= pageSize(page)) { node = popNode(node, delete); int avail = Math.min(payloadLen, pageSize(page) - mNodeTopPos); p_copyToArray(page, mNodeTopPos, entry, entryPos, avail); payloadLen -= avail; mNodeTopPos += avail; if (mNodeTopPos >= pageSize(page)) { node = popNode(node, delete); if (mNodeTopPos == pageSize(page) - 1 && p_byteGet(page, mNodeTopPos) == OP_COMMIT_TRUNCATE)
while (true) { page = node.mPage; if (mNodeTopPos < pageSize(page)) { break; if (mNodeTopPos >= pageSize(page)) { node = popNode(node, delete); int avail = Math.min(payloadLen, pageSize(page) - mNodeTopPos); p_copyToArray(page, mNodeTopPos, entry, entryPos, avail); payloadLen -= avail; mNodeTopPos += avail; if (mNodeTopPos >= pageSize(page)) { node = popNode(node, delete); if (mNodeTopPos == pageSize(page) - 1 && p_byteGet(page, mNodeTopPos) == OP_COMMIT_TRUNCATE)
/** * @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) { /*P*/ byte[] 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; } } }
page = node.mPage; pos = node.undoTop(); if (pos < pageSize(page)) { break; mLength -= 1; node.undoTop(pos); if (pos >= pageSize(page)) { node = popNode(node, delete); int avail = Math.min(payloadLen, pageSize(page) - pos); p_copyToArray(page, pos, entry, entryPos, avail); payloadLen -= avail; node.undoTop(pos); if (pos >= pageSize(page)) { node = popNode(node, delete);
mDatabase.redirty(node); /*P*/ byte[] page = node.mPage; int end = pageSize(page) - 1; node.undoTop(end); p_bytePut(page, end, OP_COMMIT_TRUNCATE);
mDatabase.redirty(node); /*P*/ byte[] page = node.mPage; int end = pageSize(page) - 1; node.undoTop(end); p_bytePut(page, end, OP_COMMIT_TRUNCATE);
if (log.mNode.undoTop() == pageSize(log.mNode.mPage) - 1 && p_byteGet(log.mNode.mPage, log.mNode.undoTop()) == OP_COMMIT_TRUNCATE)
mDatabase.redirty(node); /*P*/ byte[] page = node.mPage; int end = pageSize(page) - 1; node.undoTop(end); p_bytePut(page, end, OP_COMMIT_TRUNCATE);
if (log.mNode.undoTop() == pageSize(log.mNode.mPage) - 1 && p_byteGet(log.mNode.mPage, log.mNode.undoTop()) == OP_COMMIT_TRUNCATE)
int payloadLen = p_uintGetVar(mNode.mPage, pos); pos += calcUnsignedVarIntLength(payloadLen); if (pos + payloadLen > pageSize(mNode.mPage)) {