mirror of
https://github.com/OpenHFT/Chronicle-Map.git
synced 2021-09-13 01:26:12 +00:00
HCOLL-253 optimized VanillaChronicleMap.HeapWriteLocked.close() (force put), added force replication on NativeWriteLocked.close()
This commit is contained in:
@@ -2818,6 +2818,14 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
// TODO optimize -- keep replication bytes offset in SegmentState to jump directly
|
||||
long pos = segmentState.pos;
|
||||
long offset = segment.offsetFromPos(pos);
|
||||
MultiStoreBytes entry = segment.reuse(segmentState.tmpBytes, offset);
|
||||
long keySize = map.keySizeMarshaller.readSize(entry);
|
||||
entry.skip(keySize);
|
||||
segment.manageReplicationBytes(entry, true, false);
|
||||
map.onPut(segment, pos);
|
||||
segmentState.close();
|
||||
segment.writeUnlock();
|
||||
}
|
||||
@@ -2849,9 +2857,25 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
|
||||
@Override
|
||||
public void close() {
|
||||
if (putOnClose) {
|
||||
segment.putWithoutLock(copies, segmentState,
|
||||
metaKeyInterop, keyInterop, key(), keySize, map.keyIdentity(),
|
||||
map, value(), map.valueIdentity(), segmentHash, true, map, true);
|
||||
// TODO optimize -- keep keySize, valueSizePos, entryEndAddr, etc. inside
|
||||
// segmentState
|
||||
long pos = segmentState.pos;
|
||||
long offset = segment.offsetFromPos(pos);
|
||||
MultiStoreBytes entry = segment.reuse(segmentState.tmpBytes, offset);
|
||||
long keySize = map.keySizeMarshaller.readSize(entry);
|
||||
entry.skip(keySize);
|
||||
segment.manageReplicationBytes(entry, true, false);
|
||||
long valueSizePos = entry.position();
|
||||
long valueSize = map.readValueSize(entry);
|
||||
long entryEndAddr = entry.positionAddr() + valueSize;
|
||||
VI valueInterop = map.valueInteropProvider.get(copies, map.originalValueInterop);
|
||||
V value = value();
|
||||
MVI metaValueInterop = map.metaValueInteropProvider
|
||||
.get(copies, map.originalMetaValueInterop, valueInterop, value);
|
||||
long newValueSize = metaValueInterop.size(valueInterop, value);
|
||||
segment.putValue(pos, offset, entry, valueSizePos, entryEndAddr, segmentState,
|
||||
metaValueInterop, valueInterop, value, newValueSize, segment.hashLookup());
|
||||
map.onPut(segment, segmentState.pos);
|
||||
}
|
||||
putOnClose = true;
|
||||
segmentState.close();
|
||||
|
||||
Reference in New Issue
Block a user