abstract class BaseSpscLinkedAtomicArrayQueue<E> extends BaseSpscLinkedAtomicArrayQueueProducerColdFields<E> implements MessagePassingQueue<E>, QueueProgressIndicators
MessagePassingQueue.Consumer<T>, MessagePassingQueue.ExitCondition, MessagePassingQueue.Supplier<T>, MessagePassingQueue.WaitStrategy| Modifier and Type | Field and Description |
|---|---|
private static java.lang.Object |
JUMP |
producerBuffer, producerBufferLimit, producerMaskproducerIndexp0, p1, p10, p11, p12, p13, p14, p15, p16, p17, p2, p3, p4, p5, p6, p7consumerIndexconsumerBuffer, consumerMaskUNBOUNDED_CAPACITY| Constructor and Description |
|---|
BaseSpscLinkedAtomicArrayQueue() |
| Modifier and Type | Method and Description |
|---|---|
long |
currentConsumerIndex()
This method has no concurrent visibility semantics.
|
long |
currentProducerIndex()
This method has no concurrent visibility semantics.
|
int |
drain(MessagePassingQueue.Consumer<E> c)
Remove all available item from the queue and hand to consume.
|
int |
drain(MessagePassingQueue.Consumer<E> c,
int limit)
Remove up to limit elements from the queue and hand to consume.
|
void |
drain(MessagePassingQueue.Consumer<E> c,
MessagePassingQueue.WaitStrategy wait,
MessagePassingQueue.ExitCondition exit)
Remove elements from the queue and hand to consume forever.
|
int |
fill(MessagePassingQueue.Supplier<E> s)
Stuff the queue with elements from the supplier.
|
int |
fill(MessagePassingQueue.Supplier<E> s,
int limit)
Stuff the queue with up to limit elements from the supplier.
|
void |
fill(MessagePassingQueue.Supplier<E> s,
MessagePassingQueue.WaitStrategy wait,
MessagePassingQueue.ExitCondition exit)
Stuff the queue with elements from the supplier forever.
|
boolean |
isEmpty()
This method's accuracy is subject to concurrent modifications happening as the observation is carried
out.
|
java.util.Iterator<E> |
iterator() |
(package private) void |
linkOldToNew(long currIndex,
java.util.concurrent.atomic.AtomicReferenceArray<E> oldBuffer,
int offset,
java.util.concurrent.atomic.AtomicReferenceArray<E> newBuffer,
int offsetInNew,
E e) |
protected java.util.concurrent.atomic.AtomicReferenceArray<E> |
lvNextArrayAndUnlink(java.util.concurrent.atomic.AtomicReferenceArray<E> curr) |
private E |
newBufferPeek(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer,
long index) |
private E |
newBufferPoll(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer,
long index) |
boolean |
offer(E e)
Called from a producer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.offer(Object) interface. |
(package private) abstract boolean |
offerColdPath(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer,
long mask,
long pIndex,
int offset,
E v,
MessagePassingQueue.Supplier<? extends E> s) |
E |
peek()
Called from the consumer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.peek() interface. |
E |
poll()
Called from the consumer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.poll() interface. |
boolean |
relaxedOffer(E e)
Called from a producer thread subject to the restrictions appropriate to the implementation.
|
E |
relaxedPeek()
Called from the consumer thread subject to the restrictions appropriate to the implementation.
|
E |
relaxedPoll()
Called from the consumer thread subject to the restrictions appropriate to the implementation.
|
int |
size()
This method's accuracy is subject to concurrent modifications happening as the size is estimated and as
such is a best effort rather than absolute value.
|
protected void |
soNext(java.util.concurrent.atomic.AtomicReferenceArray<E> curr,
java.util.concurrent.atomic.AtomicReferenceArray<E> next) |
java.lang.String |
toString() |
(package private) void |
writeToQueue(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer,
E e,
long index,
int offset) |
lvProducerIndex, soProducerIndexlvConsumerIndex, soConsumerIndexcontains, containsAll, remove, removeAll, retainAll, toArray, toArrayclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitcapacity, clearpublic final java.util.Iterator<E> iterator()
public final int size()
MessagePassingQueuesize in interface java.util.Collection<E>size in interface MessagePassingQueue<E>size in class java.util.AbstractCollection<E>Integer.MAX_VALUE but less or equals to
capacity (if bounded).public final boolean isEmpty()
MessagePassingQueueisEmpty in interface java.util.Collection<E>isEmpty in interface MessagePassingQueue<E>isEmpty in class java.util.AbstractCollection<E>public java.lang.String toString()
toString in class java.util.AbstractCollection<E>public long currentProducerIndex()
QueueProgressIndicatorscurrentProducerIndex in interface QueueProgressIndicatorspublic long currentConsumerIndex()
QueueProgressIndicatorscurrentConsumerIndex in interface QueueProgressIndicatorsprotected final void soNext(java.util.concurrent.atomic.AtomicReferenceArray<E> curr, java.util.concurrent.atomic.AtomicReferenceArray<E> next)
protected final java.util.concurrent.atomic.AtomicReferenceArray<E> lvNextArrayAndUnlink(java.util.concurrent.atomic.AtomicReferenceArray<E> curr)
public boolean relaxedOffer(E e)
MessagePassingQueueQueue.offer(Object) this method may return false without the queue being full.relaxedOffer in interface MessagePassingQueue<E>e - not null, will throw NPE if it ispublic E relaxedPoll()
MessagePassingQueueQueue.poll() this method may return null without the queue being empty.relaxedPoll in interface MessagePassingQueue<E>public E relaxedPeek()
MessagePassingQueueQueue.peek() this method may return null without the queue being empty.relaxedPeek in interface MessagePassingQueue<E>public int drain(MessagePassingQueue.Consumer<E> c)
MessagePassingQueue
M m;
while((m = relaxedPoll()) != null){
c.accept(m);
}
There's no strong commitment to the queue being empty at the end of a drain. Called from a
consumer thread subject to the restrictions appropriate to the implementation.drain in interface MessagePassingQueue<E>public int fill(MessagePassingQueue.Supplier<E> s)
MessagePassingQueue
while(relaxedOffer(s.get());
There's no strong commitment to the queue being full at the end of a fill. Called from a
producer thread subject to the restrictions appropriate to the implementation.fill in interface MessagePassingQueue<E>public int drain(MessagePassingQueue.Consumer<E> c, int limit)
MessagePassingQueue
M m;
int i = 0;
for(;i < limit && (m = relaxedPoll()) != null; i++){
c.accept(m);
}
return i;
There's no strong commitment to the queue being empty at the end of a drain. Called from a consumer thread subject to the restrictions appropriate to the implementation.
drain in interface MessagePassingQueue<E>public int fill(MessagePassingQueue.Supplier<E> s, int limit)
MessagePassingQueue
for(int i=0; i < limit && relaxedOffer(s.get()); i++);
There's no strong commitment to the queue being full at the end of a fill. Called from a producer thread subject to the restrictions appropriate to the implementation.
fill in interface MessagePassingQueue<E>public void drain(MessagePassingQueue.Consumer<E> c, MessagePassingQueue.WaitStrategy wait, MessagePassingQueue.ExitCondition exit)
MessagePassingQueue
int idleCounter = 0;
while (exit.keepRunning()) {
E e = relaxedPoll();
if(e==null){
idleCounter = wait.idle(idleCounter);
continue;
}
idleCounter = 0;
c.accept(e);
}
Called from a consumer thread subject to the restrictions appropriate to the implementation.
drain in interface MessagePassingQueue<E>public void fill(MessagePassingQueue.Supplier<E> s, MessagePassingQueue.WaitStrategy wait, MessagePassingQueue.ExitCondition exit)
MessagePassingQueue
int idleCounter = 0;
while (exit.keepRunning()) {
E e = s.get();
while (!relaxedOffer(e)) {
idleCounter = wait.idle(idleCounter);
continue;
}
idleCounter = 0;
}
Called from a producer thread subject to the restrictions appropriate to the implementation.
fill in interface MessagePassingQueue<E>public boolean offer(E e)
Queue.offer(Object) interface.
This implementation is correct for single producer thread use only.
offer in interface java.util.Queue<E>offer in interface MessagePassingQueue<E>e - not null, will throw NPE if it isabstract boolean offerColdPath(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer, long mask, long pIndex, int offset, E v, MessagePassingQueue.Supplier<? extends E> s)
public E poll()
Queue.poll() interface.
This implementation is correct for single consumer thread use only.
poll in interface java.util.Queue<E>poll in interface MessagePassingQueue<E>public E peek()
Queue.peek() interface.
This implementation is correct for single consumer thread use only.
peek in interface java.util.Queue<E>peek in interface MessagePassingQueue<E>final void linkOldToNew(long currIndex,
java.util.concurrent.atomic.AtomicReferenceArray<E> oldBuffer,
int offset,
java.util.concurrent.atomic.AtomicReferenceArray<E> newBuffer,
int offsetInNew,
E e)
final void writeToQueue(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer, E e, long index, int offset)
private E newBufferPeek(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer, long index)