@Override public boolean add(final long pageId, final byte[] page, final int offset, final boolean canEvict) { return add(pageId, canEvict, (dst, pageSize) -> { dst.put(page, offset, pageSize); }); }
@Override public boolean copy(final long pageId, final int start, final byte[] page, final int offset) { return copy(pageId, start, (src, pageSize) -> { src.get(page, offset, pageSize); }); }
public boolean remove(final long pageId, final byte[] page, final int offset, final int length) { return remove(pageId, page == null ? null : (src, pageSize) -> { src.get(page, offset, length); }); }
private boolean remove(final long pageId, final CopyFromBB copier) { acquireExclusive(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { releaseExclusive();
private boolean copy(final long pageId, final int start, final CopyFromBB copier) { acquireShared(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { releaseShared();
/** * @param capacity capacity in bytes */ BasicPageCache(int capacity, int pageSize) { int entryCount = entryCountFor(capacity, pageSize); mPageSize = pageSize; mHashTable = new int[entryCount]; acquireExclusive(); mNodesByteBuffer = ByteBuffer .allocateDirect(entryCount * (NODE_SIZE_IN_INTS * 4)) .order(ByteOrder.nativeOrder()); mNodes = mNodesByteBuffer.asIntBuffer(); mData = ByteBuffer.allocateDirect(entryCount * pageSize); // Initalize the nodes, all linked together. int ptr = 0; for (; ptr < entryCount * NODE_SIZE_IN_INTS; ptr += NODE_SIZE_IN_INTS) { mNodes.put(ptr + LESS_RECENT_PTR_FIELD, ptr - NODE_SIZE_IN_INTS); mNodes.put(ptr + MORE_RECENT_PTR_FIELD, ptr + NODE_SIZE_IN_INTS); mNodes.put(ptr + CHAIN_NEXT_PTR_FIELD, UNUSED_NODE); } mLeastRecentPtr = 0; mMostRecentPtr = ptr - NODE_SIZE_IN_INTS; for (int i=0; i<mHashTable.length; i++) { mHashTable[i] = NO_NEXT_ENTRY; } releaseExclusive(); }
@Override public void close() { acquireExclusive(); try { if (mNodes != null) { try { Utils.delete(mNodesByteBuffer); Utils.delete(mData); } finally { mNodes = null; mData = null; } } } finally { releaseExclusive(); } }
private boolean remove(final long pageId, final CopyFromBB copier) { acquireExclusive(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { releaseExclusive();
private boolean copy(final long pageId, final int start, final CopyFromBB copier) { acquireShared(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { releaseShared();
/** * @param capacity capacity in bytes */ BasicPageCache(int capacity, int pageSize) { int entryCount = entryCountFor(capacity, pageSize); mPageSize = pageSize; mHashTable = new int[entryCount]; acquireExclusive(); mNodesByteBuffer = ByteBuffer .allocateDirect(entryCount * (NODE_SIZE_IN_INTS * 4)) .order(ByteOrder.nativeOrder()); mNodes = mNodesByteBuffer.asIntBuffer(); mData = ByteBuffer.allocateDirect(entryCount * pageSize); // Initalize the nodes, all linked together. int ptr = 0; for (; ptr < entryCount * NODE_SIZE_IN_INTS; ptr += NODE_SIZE_IN_INTS) { mNodes.put(ptr + LESS_RECENT_PTR_FIELD, ptr - NODE_SIZE_IN_INTS); mNodes.put(ptr + MORE_RECENT_PTR_FIELD, ptr + NODE_SIZE_IN_INTS); mNodes.put(ptr + CHAIN_NEXT_PTR_FIELD, UNUSED_NODE); } mLeastRecentPtr = 0; mMostRecentPtr = ptr - NODE_SIZE_IN_INTS; for (int i=0; i<mHashTable.length; i++) { mHashTable[i] = NO_NEXT_ENTRY; } releaseExclusive(); }
@Override public void close() { acquireExclusive(); try { if (mNodes != null) { try { Utils.delete(mNodesByteBuffer); Utils.delete(mData); } finally { mNodes = null; mData = null; } } } finally { releaseExclusive(); } }
private boolean remove(final long pageId, final CopyFromBB copier) { acquireExclusive(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { releaseExclusive();
private boolean copy(final long pageId, final int start, final CopyFromBB copier) { acquireShared(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { releaseShared();
/** * @param capacity capacity in bytes */ BasicPageCache(int capacity, int pageSize) { int entryCount = entryCountFor(capacity, pageSize); mPageSize = pageSize; mHashTable = new int[entryCount]; acquireExclusive(); mNodesByteBuffer = ByteBuffer .allocateDirect(entryCount * (NODE_SIZE_IN_INTS * 4)) .order(ByteOrder.nativeOrder()); mNodes = mNodesByteBuffer.asIntBuffer(); mData = ByteBuffer.allocateDirect(entryCount * pageSize); // Initialize the nodes, all linked together. int ptr = 0; for (; ptr < entryCount * NODE_SIZE_IN_INTS; ptr += NODE_SIZE_IN_INTS) { mNodes.put(ptr + LESS_RECENT_PTR_FIELD, ptr - NODE_SIZE_IN_INTS); mNodes.put(ptr + MORE_RECENT_PTR_FIELD, ptr + NODE_SIZE_IN_INTS); mNodes.put(ptr + CHAIN_NEXT_PTR_FIELD, UNUSED_NODE); } mLeastRecentPtr = 0; mMostRecentPtr = ptr - NODE_SIZE_IN_INTS; for (int i=0; i<mHashTable.length; i++) { mHashTable[i] = NO_NEXT_ENTRY; } releaseExclusive(); }
@Override public void close() { acquireExclusive(); try { if (mNodes != null) { try { Utils.delete(mNodesByteBuffer); Utils.delete(mData); } finally { mNodes = null; mData = null; } } } finally { releaseExclusive(); } }
@Override public boolean copy(final long pageId, final int start, final byte[] page, final int offset) { return copy(pageId, start, (src, pageSize) -> { src.get(page, offset, pageSize); }); }
@Override public boolean add(final long pageId, final byte[] page, final int offset, final boolean canEvict) { return add(pageId, canEvict, (dst, pageSize) -> { dst.put(page, offset, pageSize); }); }
public boolean remove(final long pageId, final byte[] page, final int offset, final int length) { return remove(pageId, page == null ? null : (src, pageSize) -> { src.get(page, offset, length); }); }
private boolean add(final long pageId, final boolean canEvict, final CopyToBB copier) { acquireExclusive(); try { final IntBuffer nodes = mNodes; final int index = hash(pageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(ptr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, ptr) == pageId) { final long evictedPageId = getPageId(nodes, ptr); final int evictedIndex = hash(evictedPageId) % hashTable.length; while (true) { final int chainNextPtr = nodes.get(entryPtr + CHAIN_NEXT_PTR_FIELD); if (getPageId(nodes, entryPtr) == evictedPageId) { if (prevPtr < 0) { hashTable[evictedIndex] = chainNextPtr; setPageId(nodes, ptr, pageId); releaseExclusive();
@Override public boolean copy(final long pageId, final int start, final byte[] page, final int offset) { return copy(pageId, start, (src, pageSize) -> { src.get(page, offset, pageSize); }); }