Class OperatorMerge.MergeSubscriber<T>

java.lang.Object
rx.Subscriber<Observable<? extends T>>
rx.internal.operators.OperatorMerge.MergeSubscriber<T>
Type Parameters:
T - the value type
All Implemented Interfaces:
Observer<Observable<? extends T>>, Subscription
Enclosing class:
OperatorMerge<T>

static final class OperatorMerge.MergeSubscriber<T> extends Subscriber<Observable<? extends T>>
The subscriber that observes Observables.
  • Field Details

    • child

      final Subscriber<? super T> child
    • delayErrors

      final boolean delayErrors
    • maxConcurrent

      final int maxConcurrent
    • producer

    • queue

      volatile Queue<Object> queue
    • subscriptions

      volatile CompositeSubscription subscriptions
      Tracks the active subscriptions to sources.
    • errors

      volatile ConcurrentLinkedQueue<Throwable> errors
      Due to the emission loop, we need to store errors somewhere if !delayErrors.
    • nl

      final NotificationLite<T> nl
    • done

      volatile boolean done
    • emitting

      boolean emitting
      Guarded by this.
    • missed

      boolean missed
      Guarded by this.
    • innerGuard

      final Object innerGuard
    • innerSubscribers

      volatile OperatorMerge.InnerSubscriber<?>[] innerSubscribers
      Copy-on-write array, guarded by innerGuard.
    • uniqueId

      long uniqueId
      Used to generate unique InnerSubscriber IDs. Modified from onNext only.
    • lastId

      long lastId
      Which was the last InnerSubscriber that emitted? Accessed if emitting == true.
    • lastIndex

      int lastIndex
      What was its index in the innerSubscribers array? Accessed if emitting == true.
    • EMPTY

      static final OperatorMerge.InnerSubscriber<?>[] EMPTY
      An empty array to avoid creating new empty arrays in removeInner.
    • scalarEmissionLimit

      final int scalarEmissionLimit
    • scalarEmissionCount

      int scalarEmissionCount
  • Constructor Details

    • MergeSubscriber

      public MergeSubscriber(Subscriber<? super T> child, boolean delayErrors, int maxConcurrent)
  • Method Details

    • getOrCreateErrorQueue

      Queue<Throwable> getOrCreateErrorQueue()
    • getOrCreateComposite

      CompositeSubscription getOrCreateComposite()
    • onNext

      public void onNext(Observable<? extends T> t)
      Description copied from interface: Observer
      Provides the Observer with a new item to observe.

      The Observable may call this method 0 or more times.

      The Observable will not call this method again after it calls either Observer.onCompleted() or Observer.onError(java.lang.Throwable).

      Parameters:
      t - the item emitted by the Observable
    • emitEmpty

      void emitEmpty()
    • reportError

      private void reportError()
    • onError

      public void onError(Throwable e)
      Description copied from interface: Observer
      Notifies the Observer that the Observable has experienced an error condition.

      If the Observable calls this method, it will not thereafter call Observer.onNext(T) or Observer.onCompleted().

      Parameters:
      e - the exception encountered by the Observable
    • onCompleted

      public void onCompleted()
      Description copied from interface: Observer
      Notifies the Observer that the Observable has finished sending push-based notifications.

      The Observable will not call this method if it calls Observer.onError(java.lang.Throwable).

    • addInner

      void addInner(OperatorMerge.InnerSubscriber<T> inner)
    • removeInner

      void removeInner(OperatorMerge.InnerSubscriber<T> inner)
    • tryEmit

      void tryEmit(OperatorMerge.InnerSubscriber<T> subscriber, T value)
      Tries to emit the value directly to the child if no concurrent emission is happening at the moment.

      Since the scalar-value queue optimization applies to both the main source and the inner subscribers, we handle things in a shared manner.

      Parameters:
      subscriber -
      value -
    • queueScalar

      protected void queueScalar(OperatorMerge.InnerSubscriber<T> subscriber, T value)
    • emitScalar

      protected void emitScalar(OperatorMerge.InnerSubscriber<T> subscriber, T value, long r)
    • requestMore

      public void requestMore(long n)
    • tryEmit

      void tryEmit(T value)
      Tries to emit the value directly to the child if no concurrent emission is happening at the moment.

      Since the scalar-value queue optimization applies to both the main source and the inner subscribers, we handle things in a shared manner.

      Parameters:
      value -
      subscriber -
    • queueScalar

      protected void queueScalar(T value)
    • emitScalar

      protected void emitScalar(T value, long r)
    • emit

      void emit()
    • emitLoop

      void emitLoop()
      The standard emission loop serializing events and requests.
    • checkTerminate

      boolean checkTerminate()
      Check if the operator reached some terminal state: child unsubscribed, an error was reported and we don't delay errors.
      Returns:
      true if the child unsubscribed or there are errors available and merge doesn't delay errors.