Package org.jctools.channels.mpsc
Class MpscFFLamportOffHeapFixedSizeRingBuffer
- java.lang.Object
-
- org.jctools.channels.proxy.ProxyChannelRingBuffer
-
- org.jctools.channels.OffHeapFixedMessageSizeRingBuffer
-
- org.jctools.channels.mpsc.MpscFFLamportOffHeapFixedSizeRingBuffer
-
public final class MpscFFLamportOffHeapFixedSizeRingBuffer extends OffHeapFixedMessageSizeRingBuffer
A Multi-Producer-Single-Consumer ring buffer. This implies that any thread may call the write methods, but only a single thread may call reads for correctness to maintained.
This implementation follows patterns for False Sharing protection.
This implementation is using the Fast Flow method for polling from the queue (with minor change to correctly publish the index) and an extension of the Leslie Lamport concurrent queue algorithm (originated by Martin Thompson) on the producer side.
-
-
Field Summary
-
Fields inherited from class org.jctools.channels.OffHeapFixedMessageSizeRingBuffer
bufferAddress, consumerIndexAddress, HEADER_SIZE, mask, MESSAGE_INDICATOR_SIZE, messageSize, producerIndexAddress, READ_ACQUIRE_INDICATOR, READ_RELEASE_INDICATOR, referenceMessageSize, references, WRITE_ACQUIRE_INDICATOR, WRITE_RELEASE_INDICATOR
-
Fields inherited from class org.jctools.channels.proxy.ProxyChannelRingBuffer
EOF
-
-
Constructor Summary
Constructors Modifier Constructor Description MpscFFLamportOffHeapFixedSizeRingBuffer(int capacity, int primitiveMessageSize, int referenceMessageSize)
protected
MpscFFLamportOffHeapFixedSizeRingBuffer(ByteBuffer buff, int capacity, boolean isProducer, boolean isConsumer, boolean initialize, int primitiveMessageSize, Object[] references, int referenceMessageSize)
This is to be used for an IPC queue with the direct buffer used being a memory mapped file.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected long
readAcquire()
Acquire an offset to read fromprotected void
readRelease(long offset)
Release the offset from readingprotected long
writeAcquire()
Acquire an offset to write to.protected void
writeRelease(long offset)
protected void
writeRelease(long offset, int callTypeId)
Ordered store of the callTypeId for the message at offset-
Methods inherited from class org.jctools.channels.OffHeapFixedMessageSizeRingBuffer
arrayIndexForCursor, arrayIndexForCursor, capacity, consumerReferenceArrayIndex, createReferenceArray, getRequiredArraySize, getRequiredBufferSize, isEmpty, isReadReleased, lpConsumerIndex, lpProducerIndex, lvConsumerIndex, lvProducerIndex, offsetForIndex, offsetForIndex, producerReferenceArrayIndex, readAcquireState, readReference, readReleaseState, relativeIndexForOffset, relativeIndexForOffset, size, soConsumerIndex, soProducerIndex, writeAcquireState, writeReference, writeReleaseState
-
-
-
-
Constructor Detail
-
MpscFFLamportOffHeapFixedSizeRingBuffer
public MpscFFLamportOffHeapFixedSizeRingBuffer(int capacity, int primitiveMessageSize, int referenceMessageSize)
-
MpscFFLamportOffHeapFixedSizeRingBuffer
protected MpscFFLamportOffHeapFixedSizeRingBuffer(ByteBuffer buff, int capacity, boolean isProducer, boolean isConsumer, boolean initialize, int primitiveMessageSize, Object[] references, int referenceMessageSize)
This is to be used for an IPC queue with the direct buffer used being a memory mapped file.- Parameters:
buff
-capacity
-
-
-
Method Detail
-
writeAcquire
protected final long writeAcquire()
Description copied from class:ProxyChannelRingBuffer
Acquire an offset to write to. If there's no space available a wait strategy may be used.- Specified by:
writeAcquire
in classOffHeapFixedMessageSizeRingBuffer
- Returns:
- a base address for a message acquired to be written, or EOF if none is available
-
writeRelease
protected final void writeRelease(long offset)
- Specified by:
writeRelease
in classOffHeapFixedMessageSizeRingBuffer
- Parameters:
offset
- the base address of a message that we are done writing and can be read now
-
writeRelease
protected final void writeRelease(long offset, int callTypeId)
Description copied from class:ProxyChannelRingBuffer
Ordered store of the callTypeId for the message at offset- Specified by:
writeRelease
in classProxyChannelRingBuffer
- Parameters:
offset
- the offset that was released for writingcallTypeId
- A unique ID for the call
-
readAcquire
protected final long readAcquire()
Description copied from class:ProxyChannelRingBuffer
Acquire an offset to read from- Specified by:
readAcquire
in classOffHeapFixedMessageSizeRingBuffer
- Returns:
- a base address for a message acquired to be read, or EOF if none is available
-
readRelease
protected final void readRelease(long offset)
Description copied from class:ProxyChannelRingBuffer
Release the offset from reading- Specified by:
readRelease
in classOffHeapFixedMessageSizeRingBuffer
- Parameters:
offset
- the base address of a message that we are done reading and can be overwritten now
-
-