Select OF_4_BYTES for Byteable values. (possibly OF_8_BYTES in the future)

This commit is contained in:
Peter Lawrey
2014-11-01 09:26:38 +00:00
parent 8e9aba6b77
commit 9a6af6a6fb
6 changed files with 27 additions and 11 deletions
@@ -119,7 +119,7 @@ public abstract class AbstractChronicleMapBuilder<K, V,
private int valueSize = 0;
private V sampleValue;
private int entrySize = 0;
private Alignment alignment = Alignment.NO_ALIGNMENT;
private Alignment alignment;
private long entries = 1 << 20; // 1 million by default
private long lockTimeOut = 2000;
private TimeUnit lockTimeOutUnit = TimeUnit.MILLISECONDS;
@@ -142,9 +142,14 @@ public abstract class AbstractChronicleMapBuilder<K, V,
private StatelessBuilder statelessBuilder;
private File file;
AbstractChronicleMapBuilder(Class<K> keyClass, Class<V> valueClass) {
AbstractChronicleMapBuilder(Class<K> keyClass, Class<V> valueClass, Alignment alignment) {
keyBuilder = new SerializationBuilder<K>(keyClass, SerializationBuilder.Role.KEY);
valueBuilder = new SerializationBuilder<V>(valueClass, SerializationBuilder.Role.VALUE);
this.alignment = alignment;
}
protected static boolean offHeapReference(Class valueClass) {
return Byteable.class.isAssignableFrom(valueClass);
}
@@ -73,7 +73,11 @@ public final class ChronicleMapBuilder<K, V>
}
ChronicleMapBuilder(Class<K> keyClass, Class<V> valueClass) {
super(keyClass, valueClass);
super(keyClass, valueClass, getAlignmentFor(valueClass));
}
private static <V> Alignment getAlignmentFor(Class<V> valueClass) {
return offHeapReference(valueClass) ? Alignment.OF_4_BYTES : Alignment.NO_ALIGNMENT;
}
@Override
@@ -25,7 +25,7 @@ public final class OffHeapUpdatableChronicleMapBuilder<K, V>
public static <K, V> OffHeapUpdatableChronicleMapBuilder<K, V> of(
@NotNull Class<K> keyClass, @NotNull Class<V> valueClass) {
if (!Byteable.class.isAssignableFrom(valueClass)) {
if (!offHeapReference(valueClass)) {
if (!valueClass.isInterface()) {
throw new IllegalArgumentException(
"Value class should be either Byteable subclass or interface," +
@@ -37,7 +37,7 @@ public final class OffHeapUpdatableChronicleMapBuilder<K, V>
}
OffHeapUpdatableChronicleMapBuilder(Class<K> keyClass, Class<V> valueClass) {
super(keyClass, valueClass);
super(keyClass, valueClass, Alignment.OF_4_BYTES);
prepareValueBytesOnAcquire(new ZeroOutValueBytes<K, V>(valueSize()));
}
@@ -764,6 +764,13 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, KI>,
V acquire(ThreadLocalCopies copies, MKI metaKeyInterop, KI keyInterop, K key, V usingValue,
long hash2, boolean create) {
V v = acquire0(copies, metaKeyInterop, keyInterop, key, usingValue, hash2, false);
if (create && v == null)
v = acquire0(copies, metaKeyInterop, keyInterop, key, usingValue, hash2, true);
return v;
}
V acquire0(ThreadLocalCopies copies, MKI metaKeyInterop, KI keyInterop, K key, V usingValue,
long hash2, boolean create) {
if (create)
writeLock();
else
@@ -62,7 +62,7 @@ class VanillaShortShortMultiMap implements MultiMap {
public VanillaShortShortMultiMap(Bytes multiMapBytes, Bytes multiMapBitSetBytes) {
long capacity = multiMapBytes.capacity() / ENTRY_SIZE;
assert isPowerOf2(capacity);
assert (capacity / 2L) < MAX_CAPACITY;
assert (capacity / 2L) <= MAX_CAPACITY;
this.capacity = (int) capacity;
capacityMask = capacity - 1L;
capacityMask2 = (capacity - 1L) * ENTRY_SIZE;