mirror of
https://github.com/OpenHFT/Chronicle-Map.git
synced 2021-09-13 01:26:12 +00:00
Ensure the chunk size is a multiple of the alignment, closed https://github.com/OpenHFT/Chronicle-Map/issues/169
This commit is contained in:
Regular → Executable
+2
-2
@@ -708,8 +708,8 @@ public abstract class VanillaChronicleHash<K,
|
||||
|
||||
// int division is MUCH faster than long on Intel CPUs
|
||||
if (sizeInBytes <= Integer.MAX_VALUE)
|
||||
return (((int) sizeInBytes) / (int) chunkSize) + 1;
|
||||
return (int) (sizeInBytes / chunkSize) + 1;
|
||||
return (int) (sizeInBytes + chunkSize - 1) / (int) chunkSize;
|
||||
return Math.toIntExact((sizeInBytes + chunkSize - 1) / chunkSize);
|
||||
}
|
||||
|
||||
public final int size() {
|
||||
|
||||
@@ -102,4 +102,9 @@ public class ByteArrayDataAccess extends AbstractData<byte[]> implements DataAcc
|
||||
// no fields to read
|
||||
initTransients();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new String(array, 0, 0, array.length);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -730,6 +730,8 @@ public final class ChronicleMapBuilder<K, V> implements
|
||||
}
|
||||
if (actualChunkSize <= 0)
|
||||
throw new IllegalArgumentException("Chunk size must be positive");
|
||||
if (alignment > 0 && actualChunkSize % alignment != 0)
|
||||
throw new IllegalArgumentException("The chunk size (" + actualChunkSize + ") must be a multiple of the alignment (" + alignment + ")");
|
||||
this.actualChunkSize = actualChunkSize;
|
||||
return this;
|
||||
}
|
||||
@@ -928,16 +930,25 @@ public final class ChronicleMapBuilder<K, V> implements
|
||||
}
|
||||
if (Jvm.isArm() && alignment < 8)
|
||||
return this;
|
||||
validateAlignment(actualChunkSize, actualChunkSize, alignment);
|
||||
|
||||
this.alignment = alignment;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void validateAlignment(int ifSet, int actualChunkSize, int alignment) {
|
||||
if (ifSet > 0 && actualChunkSize % alignment != 0)
|
||||
throw new IllegalArgumentException("The chunk size (" + actualChunkSize + ") must be a multiple of the alignment (" + alignment + ")");
|
||||
}
|
||||
|
||||
int valueAlignment() {
|
||||
if (alignment != UNDEFINED_ALIGNMENT_CONFIG)
|
||||
return alignment;
|
||||
try {
|
||||
if (Values.isValueInterfaceOrImplClass(valueBuilder.tClass)) {
|
||||
return ValueModel.acquire(valueBuilder.tClass).recommendedOffsetAlignment();
|
||||
int alignment = ValueModel.acquire(valueBuilder.tClass).recommendedOffsetAlignment();
|
||||
validateAlignment(alignment, actualChunkSize, alignment);
|
||||
return alignment;
|
||||
} else {
|
||||
return NO_ALIGNMENT;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user