Refactor MpscLinkedQueue.poll · ReactiveX/RxJava@b8582b9 (original) (raw)

File tree

1 file changed

lines changed

1 file changed

lines changed

Original file line number Diff line number Diff line change
@@ -87,23 +87,19 @@ public boolean offer(final T e) {
87 87 public T poll() {
88 88 LinkedQueueNode<T> currConsumerNode = lpConsumerNode(); // don't load twice, it's alright
89 89 LinkedQueueNode<T> nextNode = currConsumerNode.lvNext();
90 -if (nextNode != null) {
91 -// we have to null out the value because we are going to hang on to the node
92 -final T nextValue = nextNode.getAndNullValue();
93 -spConsumerNode(nextNode);
94 -return nextValue;
90 +final T nextValue;
91 +if (nextNode == null && currConsumerNode == lvProducerNode()) {
92 +return null;
95 93 }
96 -else if (currConsumerNode != lvProducerNode()) {
94 +if (nextNode == null) {
97 95 // spin, we are no longer wait free
98 96 while ((nextNode = currConsumerNode.lvNext()) == null) { } // NOPMD
99 97 // got the next node...
100 -
101 -// we have to null out the value because we are going to hang on to the node
102 -final T nextValue = nextNode.getAndNullValue();
103 -spConsumerNode(nextNode);
104 -return nextValue;
105 98 }
106 -return null;
99 +// we have to null out the value because we are going to hang on to the node
100 +nextValue = nextNode.getAndNullValue();
101 +spConsumerNode(nextNode);
102 +return nextValue;
107 103 }
108 104
109 105 @Override