package org.jctools_voltpatches.queues;
import org.jctools_voltpatches.util.JvmInfo;
import org.jctools_voltpatches.util.UnsafeRefArrayAccess;
public final class PaddedCircularArrayOffsetCalculator {
static final int REF_BUFFER_PAD;
static final long REF_ARRAY_BASE;
static {
// 2 cache lines pad
REF_BUFFER_PAD = (JvmInfo.CACHE_LINE_SIZE * 2) >> UnsafeRefArrayAccess.REF_ELEMENT_SHIFT;
// Including the buffer pad in the array base offset
final int paddingOffset = REF_BUFFER_PAD << UnsafeRefArrayAccess.REF_ELEMENT_SHIFT;
REF_ARRAY_BASE = UnsafeRefArrayAccess.REF_ARRAY_BASE + paddingOffset;
}
private PaddedCircularArrayOffsetCalculator() {
}
@SuppressWarnings("unchecked")
public static <E> E[] allocate(int capacity) {
return (E[]) new Object[capacity + REF_BUFFER_PAD * 2];
}
/**
* @param index desirable element index
* @param mask
* @return the offset in bytes within the array for a given index.
*/
protected static long calcElementOffset(long index, long mask) {
return REF_ARRAY_BASE + ((index & mask) << UnsafeRefArrayAccess.REF_ELEMENT_SHIFT);
}
}