Avoid redundant reads of head in peakNode
Motivation: There is not need todo redunant reads of head in peakNode as we can just spin on next() until it becomes visible. Modifications: Remove redundant reads of head in peakNode. This is based on @nitsanw's patch for akka. See https://github.com/akka/akka/pull/15596 Result: Less volatile access.
This commit is contained in:
parent
16a8f8b5aa
commit
a32652197b
@ -97,21 +97,18 @@ final class MpscLinkedQueue<E> extends MpscLinkedQueueTailRef<E> implements Queu
|
|||||||
* Returns the node right next to the head, which contains the first element of this queue.
|
* Returns the node right next to the head, which contains the first element of this queue.
|
||||||
*/
|
*/
|
||||||
private MpscLinkedQueueNode<E> peekNode() {
|
private MpscLinkedQueueNode<E> peekNode() {
|
||||||
for (;;) {
|
MpscLinkedQueueNode<E> head = headRef();
|
||||||
final MpscLinkedQueueNode<E> head = headRef();
|
MpscLinkedQueueNode<E> next = head.next();
|
||||||
final MpscLinkedQueueNode<E> next = head.next();
|
if (next == null && head != tailRef()) {
|
||||||
if (next != null) {
|
// if tail != head this is not going to change until consumer makes progress
|
||||||
return next;
|
// we can avoid reading the head and just spin on next until it shows up
|
||||||
}
|
//
|
||||||
if (head == tailRef()) {
|
// See https://github.com/akka/akka/pull/15596
|
||||||
return null;
|
do {
|
||||||
}
|
next = head.next();
|
||||||
|
} while (next == null);
|
||||||
// If we are here, it means:
|
|
||||||
// * offer() is adding the first element, and
|
|
||||||
// * it's between replaceTail(newTail) and oldTail.setNext(newTail).
|
|
||||||
// (i.e. next == oldTail and oldTail.next == null and head == oldTail != newTail)
|
|
||||||
}
|
}
|
||||||
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user