private Long createAttachedChain(ByteBuffer keyBuffer, int hash, ByteBuffer elemBuffer) { long chain = storage.allocate(keyBuffer.remaining() + elemBuffer.remaining() + this.totalChainHeaderSize + ELEMENT_HEADER_SIZE); if (chain < 0) { return null; } int keySize = keyBuffer.remaining(); storage.writeInt(chain + CHAIN_HEADER_KEY_HASH_OFFSET, hash); storage.writeInt(chain + CHAIN_HEADER_KEY_LENGTH_OFFSET, Integer.MIN_VALUE | keySize); storage.writeBuffer(chain + this.totalChainHeaderSize + ELEMENT_HEADER_SIZE + elemBuffer.remaining(), keyBuffer); if (extendedChainHeaderSize > 0) { storage.writeBuffer(chain + CHAIN_HEADER_SIZE, emptyExtendedChainHeader.duplicate()); } long element = chain + this.totalChainHeaderSize; writeElement(element, elemBuffer); storage.writeLong(element + ELEMENT_HEADER_NEXT_OFFSET, chain); storage.writeLong(chain + CHAIN_HEADER_TAIL_OFFSET, element); return chain; }
(binaryValue.remaining() - DETACHED_CONTIGUOUS_CHAIN_HEADER_SIZE) + this.totalChainHeaderSize; long chain = storage.allocate(totalSize); if (chain < 0) { return null;
private void writeToExtendedArea(long chainAddress, int hash, ByteBuffer keyBuffer, ByteBuffer valueBuffer) { ExtendedHeaderForTest hdr = createAtExtensionAddress(chainAddress); long address = hdr.getAddress(); if (address != NULL_ENCODING) { // free previous extendedArea.free(address); } else { chainAddresses.add(chainAddress); } int size = (2 * Integer.BYTES) + keyBuffer.remaining() + valueBuffer.remaining(); address = extendedArea.allocate(size); hdr.setAddress(address); hdr.setHashAndSize(hash, size); extendedArea.writeInt(address + STORAGE_KEY_LENGTH_OFFSET, keyBuffer.remaining()); extendedArea.writeInt(address + STORAGE_VALUE_LENGTH_OFFSET, valueBuffer.remaining()); extendedArea.writeBuffer(address + STORAGE_HEADER_OFFSET, keyBuffer.duplicate()); extendedArea.writeBuffer(address + STORAGE_HEADER_OFFSET + keyBuffer.remaining(), valueBuffer.duplicate()); }
@Override protected Integer writeBuffer(ByteBuffer buffer, int hash) { int length = buffer.remaining(); int address = (int) storageArea.allocate(length + HEADER_LENGTH); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + LENGTH_OFFSET, length); storageArea.writeBuffer(address + DATA_OFFSET, buffer); return address; } else { return null; } }
@Override protected Integer writeBuffer(ByteBuffer buffer, int hash) { int length = buffer.remaining(); int address = (int) storageArea.allocate(length + HEADER_LENGTH); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + LENGTH_OFFSET, length); storageArea.writeBuffer(address + DATA_OFFSET, buffer); return address; } else { return null; } }
@Override protected Long writeMappingBuffers(ByteBuffer keyBuffer, ByteBuffer valueBuffer, int hash) { int keyLength = keyBuffer.remaining(); int valueLength = valueBuffer.remaining(); long address = storageArea.allocate(keyLength + valueLength + HEADER_SIZE); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + KEY_LENGTH_OFFSET, keyLength); storageArea.writeInt(address + VALUE_LENGTH_OFFSET, valueLength); storageArea.writeBuffer(address + DATA_OFFSET, keyBuffer); storageArea.writeBuffer(address + DATA_OFFSET + keyLength, valueBuffer); return address; } else { return null; } }
@Override protected Long writeMappingBuffers(ByteBuffer keyBuffer, ByteBuffer valueBuffer, int hash) { int keyLength = keyBuffer.remaining(); int valueLength = valueBuffer.remaining(); long address = storageArea.allocate(keyLength + valueLength + HEADER_SIZE); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + KEY_LENGTH_OFFSET, keyLength); storageArea.writeInt(address + VALUE_LENGTH_OFFSET, valueLength); storageArea.writeBuffer(address + DATA_OFFSET, keyBuffer); storageArea.writeBuffer(address + DATA_OFFSET + keyLength, valueBuffer); return address; } else { return null; } }
@Override protected Long writeMappingBuffersGathering(ByteBuffer[] keyBuffers, ByteBuffer[] valueBuffers, int hash) { int keyLength = totalLength(keyBuffers); int valueLength = totalLength(valueBuffers); long address = storageArea.allocate(keyLength + valueLength + HEADER_SIZE); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + KEY_LENGTH_OFFSET, keyLength); storageArea.writeInt(address + VALUE_LENGTH_OFFSET, valueLength); storageArea.writeBuffers(address + DATA_OFFSET, keyBuffers); storageArea.writeBuffers(address + DATA_OFFSET + keyLength, valueBuffers); return address; } else { return null; } }
@Override protected Long writeMappingBuffersGathering(ByteBuffer[] keyBuffers, ByteBuffer[] valueBuffers, int hash) { int keyLength = totalLength(keyBuffers); int valueLength = totalLength(valueBuffers); long address = storageArea.allocate(keyLength + valueLength + HEADER_SIZE); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + KEY_LENGTH_OFFSET, keyLength); storageArea.writeInt(address + VALUE_LENGTH_OFFSET, valueLength); storageArea.writeBuffers(address + DATA_OFFSET, keyBuffers); storageArea.writeBuffers(address + DATA_OFFSET + keyLength, valueBuffers); return address; } else { return null; } }