private int readElementLength(long element) { // The most significant bit (MSB) of element length is used to signify whether an element is explicitly allocated // (msb clear) or part of a contiguous chain (msb set). Clear the msb when returning length. return Integer.MAX_VALUE & storage.readInt(element + ELEMENT_HEADER_LENGTH_OFFSET); }
@Override public int readKeyHash(long encoding) { return storage.readInt(encoding + CHAIN_HEADER_KEY_HASH_OFFSET); }
private boolean isHead(long address) { return storage.readInt(address + CHAIN_HEADER_KEY_LENGTH_OFFSET) < 0; }
private int readKeySize(long encoding) { return Integer.MAX_VALUE & storage.readInt(encoding + CHAIN_HEADER_KEY_LENGTH_OFFSET); }
void replayIntoMap(ReadWriteLockedOffHeapClockCache<K, InternalChain> newMap) { Lock l = newMap.writeLock(); l.lock(); try { chainAddresses.forEach((a) -> { ExtendedHeaderForTest hdr = createAtExtensionAddress(a); long address = hdr.getAddress(); int keyLength = extendedArea.readInt(address + STORAGE_KEY_LENGTH_OFFSET); int valueLength = extendedArea.readInt(address + STORAGE_VALUE_LENGTH_OFFSET); ByteBuffer keyBuffer = extendedArea.readBuffer(address + STORAGE_HEADER_OFFSET, keyLength); ByteBuffer valueBuffer = extendedArea.readBuffer(address + STORAGE_HEADER_OFFSET + keyLength, valueLength); newMap.installMappingForHashAndEncoding(hdr.getHash(), keyBuffer, valueBuffer, 0); }); } finally { l.unlock(); } }
@Override public int sizeOf(long address) { int length = storageArea.readInt(address + LENGTH_OFFSET); return HEADER_LENGTH + length; } }
@Override protected WriteContext getKeyWriteContext(long address) { int keyLength = storageArea.readInt(address + KEY_LENGTH_OFFSET); return getWriteContext(address + DATA_OFFSET, keyLength); }
@Override public boolean moved(long from, long to) { int hash = storageArea.readInt(to + KEY_HASH_OFFSET); return owner.updateEncoding(hash, from, to, mask); }
@Override protected ByteBuffer readBuffer(int address) { int length = storageArea.readInt(address + LENGTH_OFFSET); return storageArea.readBuffer(address + DATA_OFFSET, length); }
@Override public boolean moved(long from, long to) { int hash = storageArea.readInt(to + KEY_HASH_OFFSET); return owner.updateEncoding(hash, from, to, mask); }
@Override public ByteBuffer readKeyBuffer(long address) { int length = storageArea.readInt(address + KEY_LENGTH_OFFSET); return storageArea.readBuffer(address + DATA_OFFSET, length).asReadOnlyBuffer(); }
@Override public ByteBuffer readKeyBuffer(long address) { int length = storageArea.readInt(address + KEY_LENGTH_OFFSET); return storageArea.readBuffer(address + DATA_OFFSET, length).asReadOnlyBuffer(); }
@Override protected WriteContext getKeyWriteContext(long address) { int keyLength = storageArea.readInt(address + KEY_LENGTH_OFFSET); return getWriteContext(address + DATA_OFFSET, keyLength); }
@Override public boolean evictAtAddress(long address, boolean shrink) { int hash = storageArea.readInt(address + KEY_HASH_OFFSET); int slot = owner.getSlotForHashAndEncoding(hash, address, mask); return owner.evict(slot, shrink); }
@Override public boolean evictAtAddress(long address, boolean shrink) { int hash = storageArea.readInt(address + KEY_HASH_OFFSET); int slot = owner.getSlotForHashAndEncoding(hash, address, ~0); return owner.evict(slot, shrink); }
@Override public boolean evictAtAddress(long address, boolean shrink) { int hash = storageArea.readInt(address + KEY_HASH_OFFSET); int slot = owner.getSlotForHashAndEncoding(hash, address, ~0); return owner.evict(slot, shrink); }