@Override public T poll() throws Exception { return qd.poll(); } }
@Override public int requestFusion(int mode) { QueueDisposable<T> qd = this.qd; if (qd != null && (mode & BOUNDARY) == 0) { int m = qd.requestFusion(mode); if (m != NONE) { syncFused = m == SYNC; } return m; } return NONE; }
@Override public void onSubscribe(Disposable d) { try { if (d instanceof QueueDisposable) { @SuppressWarnings("unchecked") QueueDisposable<Object> qd = (QueueDisposable<Object>) d; state[0] = true; int m = qd.requestFusion(QueueFuseable.ANY); if (m != QueueFuseable.NONE) { state[1] = true; state[2] = qd.isEmpty(); qd.clear(); state[3] = qd.isEmpty(); } } cdl.countDown(); } finally { d.dispose(); } }
@Override public void onNext(T t) { if (!checkSubscriptionOnce) { checkSubscriptionOnce = true; if (upstream.get() == null) { errors.add(new IllegalStateException("onSubscribe not called in proper order")); } } lastThread = Thread.currentThread(); if (establishedFusionMode == QueueDisposable.ASYNC) { try { while ((t = qd.poll()) != null) { values.add(t); } } catch (Throwable ex) { // Exceptions.throwIfFatal(e); TODO add fatal exceptions? errors.add(ex); qd.dispose(); } return; } values.add(t); if (t == null) { errors.add(new NullPointerException("onNext received a null value")); } downstream.onNext(t); }
@Override public void onSubscribe(Disposable d) { @SuppressWarnings("unchecked") QueueDisposable<Integer> qd = (QueueDisposable<Integer>)d; qd.requestFusion(QueueFuseable.ANY); assertFalse(qd.isEmpty()); try { assertEquals(1, qd.poll().intValue()); } catch (Throwable ex) { throw new RuntimeException(ex); } assertFalse(qd.isEmpty()); qd.clear(); assertTrue(qd.isEmpty()); qd.dispose(); }
@Override public void onSubscribe(Disposable d) { @SuppressWarnings("unchecked") QueueDisposable<Integer> qd = (QueueDisposable<Integer>)d; qd.requestFusion(QueueFuseable.ANY); try { assertEquals(1, qd.poll().intValue()); } catch (Throwable ex) { fail(ex.toString()); } qd.clear(); try { assertNull(qd.poll()); } catch (Throwable ex) { fail(ex.toString()); } }
qd = (QueueDisposable<T>)d; int m = qd.requestFusion(initialFusionMode); establishedFusionMode = m; try { T t; while ((t = qd.poll()) != null) { values.add(t);
@Override public boolean isEmpty() { return qd.isEmpty(); }
@Override public void clear() { qd.clear(); }
@Override public void onSubscribe(Disposable d) { @SuppressWarnings("unchecked") QueueDisposable<Integer> qd = (QueueDisposable<Integer>)d; qd.requestFusion(QueueFuseable.ANY); assertFalse(qd.isEmpty()); assertFalse(qd.isDisposed()); try { assertEquals(1, qd.poll().intValue()); } catch (Throwable ex) { throw new RuntimeException(ex); } assertFalse(qd.isEmpty()); qd.clear(); assertTrue(qd.isEmpty()); qd.dispose(); assertTrue(qd.isDisposed()); }
qs = (QueueDisposable<T>)s; int m = qs.requestFusion(initialFusionMode); establishedFusionMode = m; try { T t; while ((t = qs.poll()) != null) { values.add(t);
@Override public void onNext(T t) { if (!checkSubscriptionOnce) { checkSubscriptionOnce = true; if (subscription.get() == null) { errors.add(new IllegalStateException("onSubscribe not called in proper order")); } } lastThread = Thread.currentThread(); if (establishedFusionMode == QueueDisposable.ASYNC) { try { while ((t = qs.poll()) != null) { values.add(t); } } catch (Throwable ex) { // Exceptions.throwIfFatal(e); TODO add fatal exceptions? errors.add(ex); qs.dispose(); } return; } values.add(t); if (t == null) { errors.add(new NullPointerException("onNext received a null value")); } actual.onNext(t); }
@Override public boolean isEmpty() { return qd.isEmpty(); }
@Override public void clear() { qd.clear(); }
/** * Calls the upstream's QueueDisposable.requestFusion with the mode and * saves the established mode in {@link #sourceMode} if that mode doesn't * have the {@link QueueDisposable#BOUNDARY} flag set. * <p> * If the upstream doesn't support fusion ({@link #qd} is null), the method * returns {@link QueueDisposable#NONE}. * @param mode the fusion mode requested * @return the established fusion mode */ protected final int transitiveBoundaryFusion(int mode) { QueueDisposable<T> qd = this.qd; if (qd != null) { if ((mode & BOUNDARY) == 0) { int m = qd.requestFusion(mode); if (m != NONE) { sourceMode = m; } return m; } } return NONE; }
@Override public T poll() throws Exception { return qd.poll(); }
@Override public void onSubscribe(Disposable d) { try { if (d instanceof QueueDisposable) { @SuppressWarnings("unchecked") QueueDisposable<Object> qd = (QueueDisposable<Object>) d; state[0] = true; int m = qd.requestFusion(QueueFuseable.ANY); if (m != QueueFuseable.NONE) { state[1] = true; state[2] = qd.isEmpty(); qd.clear(); state[3] = qd.isEmpty(); } } cdl.countDown(); } finally { d.dispose(); } }