for (Long encoding : owner.encodingSet()) { ByteBuffer binaryKey = readBinaryKey(encoding); ByteBuffer binaryValue = readBinaryValue(encoding);
private void compress(FileChunk from) { for (Long encoding : from.encodings()) { ByteBuffer keyBuffer = readKeyBuffer(encoding); int keyHash = readKeyHash(encoding); ByteBuffer valueBuffer = readValueBuffer(encoding); for (FileChunk to : chunks.headMap(from.baseAddress(), true).values()) { Long address = to.writeMappingBuffers(keyBuffer, valueBuffer, keyHash); if (address != null) { long compressed = address + to.baseAddress(); if (compressed < encoding && owner.updateEncoding(keyHash, encoding, compressed, ~0)) { free(encoding); } else { free(compressed); } break; } } } }
@Override public boolean shrink() { final Lock ownerLock = owner.writeLock(); ownerLock.lock(); try { if (chunks.isEmpty()) { return false; } else { FileChunk candidate = chunks.lastEntry().getValue(); for (FileChunk c : chunks.descendingMap().values()) { c.evictAll(); compress(c); compress(candidate); if (candidate.occupied() == 0) { chunks.remove(candidate.baseAddress()).clear(); return true; } } return false; } } finally { ownerLock.unlock(); } }
for (Long encoding : owner.encodingSet()) { ByteBuffer binaryKey = readBinaryKey(encoding); ByteBuffer binaryValue = readBinaryValue(encoding);
@Override public boolean shrink() { final Lock ownerLock = owner.writeLock(); ownerLock.lock(); try { if (chunks.isEmpty()) { return false; } else { FileChunk candidate = chunks.lastEntry().getValue(); for (FileChunk c : chunks.descendingMap().values()) { c.evictAll(); compress(c); compress(candidate); if (candidate.occupied() == 0) { chunks.remove(candidate.baseAddress()).clear(); return true; } } return false; } } finally { ownerLock.unlock(); } }
private void compress(FileChunk from) { for (Long encoding : from.encodings()) { ByteBuffer keyBuffer = readKeyBuffer(encoding); int keyHash = readKeyHash(encoding); ByteBuffer valueBuffer = readValueBuffer(encoding); for (FileChunk to : chunks.headMap(from.baseAddress(), true).values()) { Long address = to.writeMappingBuffers(keyBuffer, valueBuffer, keyHash); if (address != null) { long compressed = address + to.baseAddress(); if (compressed < encoding && owner.updateEncoding(keyHash, encoding, compressed, ~0)) { free(encoding); } else { free(compressed); } break; } } } }
@Override public Lock writeLock() { return owner.writeLock(); }
@Override public Lock writeLock() { return owner.writeLock(); }
@Override public boolean isThief() { return owner.isThiefForTableAllocations(); }
@Override public boolean isThief() { return owner.isThiefForTableAllocations(); }
@Override public Lock writeLock() { return owner.writeLock(); } }
@Override public boolean moved(long from, long to) { return owner.updateEncoding(readKeyHash(to), from, to, ~0); }
@Override public boolean isThief() { return owner.isThiefForTableAllocations(); }
@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, mask); return owner.evict(slot, shrink); }
@Override public Lock writeLock() { return owner.writeLock(); } }
@Override public boolean moved(long from, long to) { return owner.updateEncoding(readKeyHash(to), from, to, ~0); }
@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 isThief() { return owner.isThiefForTableAllocations(); }
@Override public boolean moved(long from, long to) { int hash = storageArea.readInt(to + KEY_HASH_OFFSET); return owner.updateEncoding(hash, from, to, mask); }