diff --git a/src/main/java/teetime/util/concurrent/workstealing/CircularArray.java b/src/main/java/teetime/util/concurrent/workstealing/CircularArray.java index f48def9d4f23b0cec6585fa6da988e032dc1cd71..60a3991e8e77d36127e070305b0372b71c068a80 100644 --- a/src/main/java/teetime/util/concurrent/workstealing/CircularArray.java +++ b/src/main/java/teetime/util/concurrent/workstealing/CircularArray.java @@ -32,6 +32,7 @@ public class CircularArray<T> { private final long logSize; private final T[] segment; + private final long mask; /** * @@ -42,6 +43,7 @@ public class CircularArray<T> { public CircularArray(final long logSize) { this.logSize = logSize; this.segment = (T[]) new Object[1 << this.logSize]; + this.mask = this.getCapacity() - 1; // mask = 0..01..1 } public long getCapacity() { @@ -49,11 +51,11 @@ public class CircularArray<T> { } public T get(final long i) { - return this.segment[(int) (i % this.getCapacity())]; // risk of overflow + return this.segment[(int) (i & this.mask)]; // risk of overflow } public void put(final long i, final T o) { - this.segment[(int) (i % this.getCapacity())] = o; // risk of overflow + this.segment[(int) (i & this.mask)] = o; // risk of overflow } public CircularArray<T> grow(final long b, final long t) {