public static ByteBuffer allocateAlignedByteBuffer(int capacity, long align) { if (Long.bitCount(align) != 1) { throw new IllegalArgumentException("Alignment must be a power of 2"); } ByteBuffer buffy = ByteBuffer.allocateDirect((int) (capacity + align)); return alignedSlice(capacity, align, buffy); }
public SpscOffHeapIntQueue(final int capacity) { this(allocateAlignedByteBuffer( getRequiredBufferSize(capacity), PortableJvmInfo.CACHE_LINE_SIZE), Pow2.roundToPowerOfTwo(capacity),(byte)(PRODUCER | CONSUMER)); }
public static ByteBuffer alignedSlice(int capacity, long align, ByteBuffer buffy) { long address = getAddress(buffy); if ((address & (align - 1)) == 0) { buffy.limit(capacity); return buffy.slice(); } else { int newPosition = (int) (align - (address & (align - 1))); if (newPosition + capacity > buffy.capacity()) { throw new IllegalArgumentException("it's impossible!"); } int oldPosition = buffy.position(); buffy.position(newPosition); int newLimit = newPosition + capacity; buffy.limit(newLimit); ByteBuffer slice = buffy.slice(); buffy.position(oldPosition); return slice; } } }
final int capacity, byte viewMask) { this.capacity = Pow2.roundToPowerOfTwo(capacity); buffy = alignedSlice(4 * PortableJvmInfo.CACHE_LINE_SIZE + (this.capacity << INT_ELEMENT_SCALE), PortableJvmInfo.CACHE_LINE_SIZE, buff); long alignedAddress = UnsafeDirectByteBuffer.getAddress(buffy);
this.buffy = alignedSlice(HEADER_SIZE + (actualCapacity * (this.messageSize)), CACHE_LINE_SIZE, buff); long alignedAddress = UnsafeDirectByteBuffer.getAddress(buffy); if (alignedAddress % CACHE_LINE_SIZE != 0) { throw new IllegalStateException("buffer is expected to be cache line aligned by now");
public OffHeapFixedMessageSizeRingBuffer(final int capacity, final int primitiveMessageSize, int referenceMessageSize) { this(allocateAlignedByteBuffer(getRequiredBufferSize(capacity, primitiveMessageSize), CACHE_LINE_SIZE), Pow2.roundToPowerOfTwo(capacity), true, true, true, primitiveMessageSize, createReferenceArray(capacity, referenceMessageSize), referenceMessageSize); }
public SpscOffHeapFixedSizeRingBuffer(final int capacity, final int messageSize, final int referenceMessageSize) { this(allocateAlignedByteBuffer(getRequiredBufferSize(capacity, messageSize), CACHE_LINE_SIZE), Pow2.roundToPowerOfTwo(capacity), true, true, true, messageSize, createReferenceArray(capacity, referenceMessageSize), referenceMessageSize); }
public MpscOffHeapFixedSizeRingBuffer(final int capacity, final int messageSize, int referenceMessageSize) { this(allocateAlignedByteBuffer(getRequiredBufferSize(capacity, messageSize), PortableJvmInfo.CACHE_LINE_SIZE), Pow2.roundToPowerOfTwo(capacity), true, true, true, messageSize, createReferenceArray(capacity, referenceMessageSize), referenceMessageSize); }
public MpscFFLamportOffHeapFixedSizeRingBuffer(final int capacity, final int primitiveMessageSize, final int referenceMessageSize) { this(allocateAlignedByteBuffer(getRequiredBufferSize(capacity, primitiveMessageSize), PortableJvmInfo.CACHE_LINE_SIZE), Pow2.roundToPowerOfTwo(capacity), true, true, true, primitiveMessageSize, createReferenceArray(capacity, referenceMessageSize), referenceMessageSize); }