@Override public boolean isEmpty() { return queue.isEmpty(); } }
@Override public boolean isEmpty() { return queue.isEmpty(); } }
/** * Makes sure the fast-path emits in order. * @param value the value to emit or queue up * @param delayError if true, errors are delayed until the source has terminated * @param disposable the resource to dispose if the drain terminates */ protected final void fastPathOrderedEmit(U value, boolean delayError, Disposable disposable) { final Observer<? super V> observer = downstream; final SimplePlainQueue<U> q = queue; if (wip.get() == 0 && wip.compareAndSet(0, 1)) { if (q.isEmpty()) { accept(observer, value); if (leave(-1) == 0) { return; } } else { q.offer(value); } } else { q.offer(value); if (!enter()) { return; } } QueueDrainHelper.drainLoop(q, observer, delayError, disposable, this); }
if (requested.get() != e) { SimplePlainQueue<T> q = queue; if (q == null || q.isEmpty()) {
if (requested.get() != e) { SimplePlainQueue<T> q = queue; if (q == null || q.isEmpty()) {
/** * Makes sure the fast-path emits in order. * @param value the value to emit or queue up * @param delayError if true, errors are delayed until the source has terminated * @param disposable the resource to dispose if the drain terminates */ protected final void fastPathOrderedEmit(U value, boolean delayError, Disposable disposable) { final Observer<? super V> s = actual; final SimplePlainQueue<U> q = queue; if (wip.get() == 0 && wip.compareAndSet(0, 1)) { if (q.isEmpty()) { accept(s, value); if (leave(-1) == 0) { return; } } else { q.offer(value); } } else { q.offer(value); if (!enter()) { return; } } QueueDrainHelper.drainLoop(q, s, delayError, disposable, this); }
long r = requested.get(); if (r != 0L) { if (q.isEmpty()) { if (accept(s, value)) { if (r != Long.MAX_VALUE) {
public static <T, U> void drainLoop(SimplePlainQueue<T> q, Observer<? super U> a, boolean delayError, Disposable dispose, ObservableQueueDrain<T, U> qd) { int missed = 1; for (;;) { if (checkTerminated(qd.done(), q.isEmpty(), a, delayError, q, dispose, qd)) { return; } for (;;) { boolean d = qd.done(); T v = q.poll(); boolean empty = v == null; if (checkTerminated(d, empty, a, delayError, q, dispose, qd)) { return; } if (empty) { break; } qd.accept(a, v); } missed = qd.leave(-missed); if (missed == 0) { break; } } }
if (requested.get() != e) { SimplePlainQueue<T> q = queue; if (q == null || q.isEmpty()) {
boolean empty = q == null || q.isEmpty();
boolean empty = q == null || q.isEmpty();
long r = requested.get(); if (r != 0L) { if (q.isEmpty()) { if (accept(s, value)) { if (r != Long.MAX_VALUE) {
return; if (q.isEmpty()) { a.onComplete(); return;
public static <T, U> void drainLoop(SimplePlainQueue<T> q, Observer<? super U> a, boolean delayError, Disposable dispose, ObservableQueueDrain<T, U> qd) { int missed = 1; for (;;) { if (checkTerminated(qd.done(), q.isEmpty(), a, delayError, q, dispose, qd)) { return; } for (;;) { boolean d = qd.done(); T v = q.poll(); boolean empty = v == null; if (checkTerminated(d, empty, a, delayError, q, dispose, qd)) { return; } if (empty) { break; } qd.accept(a, v); } missed = qd.leave(-missed); if (missed == 0) { break; } } }
@Test(timeout = 10000) public void cancelNoConcurrentClean() { TestObserver<Integer> to = new TestObserver<Integer>(); ConcatMapSingleMainObserver<Integer, Integer> operator = new ConcatMapSingleMainObserver<Integer, Integer>( to, Functions.justFunction(Single.<Integer>never()), 16, ErrorMode.IMMEDIATE); operator.onSubscribe(Disposables.empty()); operator.queue.offer(1); operator.getAndIncrement(); to.cancel(); assertFalse(operator.queue.isEmpty()); operator.addAndGet(-2); operator.dispose(); assertTrue(operator.queue.isEmpty()); }
@Test(timeout = 10000) public void cancelNoConcurrentClean() { TestObserver<Integer> to = new TestObserver<Integer>(); ConcatMapMaybeMainObserver<Integer, Integer> operator = new ConcatMapMaybeMainObserver<Integer, Integer>( to, Functions.justFunction(Maybe.<Integer>never()), 16, ErrorMode.IMMEDIATE); operator.onSubscribe(Disposables.empty()); operator.queue.offer(1); operator.getAndIncrement(); to.dispose(); assertFalse(operator.queue.isEmpty()); operator.addAndGet(-2); operator.dispose(); assertTrue(operator.queue.isEmpty()); }
@Test(timeout = 10000) public void cancelNoConcurrentClean() { TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); ConcatMapMaybeSubscriber<Integer, Integer> operator = new ConcatMapMaybeSubscriber<Integer, Integer>( ts, Functions.justFunction(Maybe.<Integer>never()), 16, ErrorMode.IMMEDIATE); operator.onSubscribe(new BooleanSubscription()); operator.queue.offer(1); operator.getAndIncrement(); ts.cancel(); assertFalse(operator.queue.isEmpty()); operator.addAndGet(-2); operator.cancel(); assertTrue(operator.queue.isEmpty()); }
@Test(timeout = 10000) public void cancelNoConcurrentClean() { TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); ConcatMapSingleSubscriber<Integer, Integer> operator = new ConcatMapSingleSubscriber<Integer, Integer>( ts, Functions.justFunction(Single.<Integer>never()), 16, ErrorMode.IMMEDIATE); operator.onSubscribe(new BooleanSubscription()); operator.queue.offer(1); operator.getAndIncrement(); ts.cancel(); assertFalse(operator.queue.isEmpty()); operator.addAndGet(-2); operator.cancel(); assertTrue(operator.queue.isEmpty()); }
if (d && (svq == null || svq.isEmpty()) && n == 0 && nSources == 0) { Throwable ex = errors.terminate(); if (ex != ExceptionHelper.TERMINATED) {