352 lines
14 KiB
Java
352 lines
14 KiB
Java
package io.reactivex.internal.operators.observable;
|
|
|
|
import io.reactivex.Observable;
|
|
import io.reactivex.ObservableSource;
|
|
import io.reactivex.Observer;
|
|
import io.reactivex.disposables.CompositeDisposable;
|
|
import io.reactivex.disposables.Disposable;
|
|
import io.reactivex.exceptions.Exceptions;
|
|
import io.reactivex.functions.BiFunction;
|
|
import io.reactivex.functions.Function;
|
|
import io.reactivex.internal.disposables.DisposableHelper;
|
|
import io.reactivex.internal.functions.ObjectHelper;
|
|
import io.reactivex.internal.queue.SpscLinkedArrayQueue;
|
|
import io.reactivex.internal.util.ExceptionHelper;
|
|
import io.reactivex.plugins.RxJavaPlugins;
|
|
import io.reactivex.subjects.UnicastSubject;
|
|
import java.util.Iterator;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.Map;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class ObservableGroupJoin<TLeft, TRight, TLeftEnd, TRightEnd, R> extends AbstractObservableWithUpstream<TLeft, R> {
|
|
final ObservableSource<? extends TRight> b;
|
|
final Function<? super TLeft, ? extends ObservableSource<TLeftEnd>> c;
|
|
final Function<? super TRight, ? extends ObservableSource<TRightEnd>> d;
|
|
final BiFunction<? super TLeft, ? super Observable<TRight>, ? extends R> e;
|
|
|
|
static final class GroupJoinDisposable<TLeft, TRight, TLeftEnd, TRightEnd, R> extends AtomicInteger implements Disposable, JoinSupport {
|
|
static final Integer n = 1;
|
|
static final Integer o = 2;
|
|
static final Integer p = 3;
|
|
static final Integer q = 4;
|
|
final Observer<? super R> a;
|
|
final Function<? super TLeft, ? extends ObservableSource<TLeftEnd>> g;
|
|
final Function<? super TRight, ? extends ObservableSource<TRightEnd>> h;
|
|
final BiFunction<? super TLeft, ? super Observable<TRight>, ? extends R> i;
|
|
int k;
|
|
int l;
|
|
volatile boolean m;
|
|
final CompositeDisposable c = new CompositeDisposable();
|
|
final SpscLinkedArrayQueue<Object> b = new SpscLinkedArrayQueue<>(Observable.bufferSize());
|
|
final Map<Integer, UnicastSubject<TRight>> d = new LinkedHashMap();
|
|
final Map<Integer, TRight> e = new LinkedHashMap();
|
|
final AtomicReference<Throwable> f = new AtomicReference<>();
|
|
final AtomicInteger j = new AtomicInteger(2);
|
|
|
|
GroupJoinDisposable(Observer<? super R> observer, Function<? super TLeft, ? extends ObservableSource<TLeftEnd>> function, Function<? super TRight, ? extends ObservableSource<TRightEnd>> function2, BiFunction<? super TLeft, ? super Observable<TRight>, ? extends R> biFunction) {
|
|
this.a = observer;
|
|
this.g = function;
|
|
this.h = function2;
|
|
this.i = biFunction;
|
|
}
|
|
|
|
void a() {
|
|
this.c.dispose();
|
|
}
|
|
|
|
void b() {
|
|
if (getAndIncrement() != 0) {
|
|
return;
|
|
}
|
|
SpscLinkedArrayQueue<?> spscLinkedArrayQueue = this.b;
|
|
Observer<? super R> observer = this.a;
|
|
int i = 1;
|
|
while (!this.m) {
|
|
if (this.f.get() != null) {
|
|
spscLinkedArrayQueue.clear();
|
|
a();
|
|
a(observer);
|
|
return;
|
|
}
|
|
boolean z = this.j.get() == 0;
|
|
Integer num = (Integer) spscLinkedArrayQueue.poll();
|
|
boolean z2 = num == null;
|
|
if (z && z2) {
|
|
Iterator<UnicastSubject<TRight>> it = this.d.values().iterator();
|
|
while (it.hasNext()) {
|
|
it.next().onComplete();
|
|
}
|
|
this.d.clear();
|
|
this.e.clear();
|
|
this.c.dispose();
|
|
observer.onComplete();
|
|
return;
|
|
}
|
|
if (z2) {
|
|
i = addAndGet(-i);
|
|
if (i == 0) {
|
|
return;
|
|
}
|
|
} else {
|
|
Object poll = spscLinkedArrayQueue.poll();
|
|
if (num == n) {
|
|
UnicastSubject d = UnicastSubject.d();
|
|
int i2 = this.k;
|
|
this.k = i2 + 1;
|
|
this.d.put(Integer.valueOf(i2), d);
|
|
try {
|
|
ObservableSource apply = this.g.apply(poll);
|
|
ObjectHelper.a(apply, "The leftEnd returned a null ObservableSource");
|
|
ObservableSource observableSource = apply;
|
|
LeftRightEndObserver leftRightEndObserver = new LeftRightEndObserver(this, true, i2);
|
|
this.c.b(leftRightEndObserver);
|
|
observableSource.subscribe(leftRightEndObserver);
|
|
if (this.f.get() != null) {
|
|
spscLinkedArrayQueue.clear();
|
|
a();
|
|
a(observer);
|
|
return;
|
|
}
|
|
try {
|
|
R apply2 = this.i.apply(poll, d);
|
|
ObjectHelper.a(apply2, "The resultSelector returned a null value");
|
|
observer.onNext(apply2);
|
|
Iterator<TRight> it2 = this.e.values().iterator();
|
|
while (it2.hasNext()) {
|
|
d.onNext(it2.next());
|
|
}
|
|
} catch (Throwable th) {
|
|
a(th, observer, spscLinkedArrayQueue);
|
|
return;
|
|
}
|
|
} catch (Throwable th2) {
|
|
a(th2, observer, spscLinkedArrayQueue);
|
|
return;
|
|
}
|
|
} else if (num == o) {
|
|
int i3 = this.l;
|
|
this.l = i3 + 1;
|
|
this.e.put(Integer.valueOf(i3), poll);
|
|
try {
|
|
ObservableSource apply3 = this.h.apply(poll);
|
|
ObjectHelper.a(apply3, "The rightEnd returned a null ObservableSource");
|
|
ObservableSource observableSource2 = apply3;
|
|
LeftRightEndObserver leftRightEndObserver2 = new LeftRightEndObserver(this, false, i3);
|
|
this.c.b(leftRightEndObserver2);
|
|
observableSource2.subscribe(leftRightEndObserver2);
|
|
if (this.f.get() != null) {
|
|
spscLinkedArrayQueue.clear();
|
|
a();
|
|
a(observer);
|
|
return;
|
|
} else {
|
|
Iterator<UnicastSubject<TRight>> it3 = this.d.values().iterator();
|
|
while (it3.hasNext()) {
|
|
it3.next().onNext(poll);
|
|
}
|
|
}
|
|
} catch (Throwable th3) {
|
|
a(th3, observer, spscLinkedArrayQueue);
|
|
return;
|
|
}
|
|
} else if (num == p) {
|
|
LeftRightEndObserver leftRightEndObserver3 = (LeftRightEndObserver) poll;
|
|
UnicastSubject<TRight> remove = this.d.remove(Integer.valueOf(leftRightEndObserver3.c));
|
|
this.c.a(leftRightEndObserver3);
|
|
if (remove != null) {
|
|
remove.onComplete();
|
|
}
|
|
} else if (num == q) {
|
|
LeftRightEndObserver leftRightEndObserver4 = (LeftRightEndObserver) poll;
|
|
this.e.remove(Integer.valueOf(leftRightEndObserver4.c));
|
|
this.c.a(leftRightEndObserver4);
|
|
}
|
|
}
|
|
}
|
|
spscLinkedArrayQueue.clear();
|
|
}
|
|
|
|
@Override // io.reactivex.disposables.Disposable
|
|
public void dispose() {
|
|
if (this.m) {
|
|
return;
|
|
}
|
|
this.m = true;
|
|
a();
|
|
if (getAndIncrement() == 0) {
|
|
this.b.clear();
|
|
}
|
|
}
|
|
|
|
void a(Observer<?> observer) {
|
|
Throwable a = ExceptionHelper.a(this.f);
|
|
Iterator<UnicastSubject<TRight>> it = this.d.values().iterator();
|
|
while (it.hasNext()) {
|
|
it.next().onError(a);
|
|
}
|
|
this.d.clear();
|
|
this.e.clear();
|
|
observer.onError(a);
|
|
}
|
|
|
|
void a(Throwable th, Observer<?> observer, SpscLinkedArrayQueue<?> spscLinkedArrayQueue) {
|
|
Exceptions.b(th);
|
|
ExceptionHelper.a(this.f, th);
|
|
spscLinkedArrayQueue.clear();
|
|
a();
|
|
a(observer);
|
|
}
|
|
|
|
@Override // io.reactivex.internal.operators.observable.ObservableGroupJoin.JoinSupport
|
|
public void a(LeftRightObserver leftRightObserver) {
|
|
this.c.c(leftRightObserver);
|
|
this.j.decrementAndGet();
|
|
b();
|
|
}
|
|
|
|
@Override // io.reactivex.internal.operators.observable.ObservableGroupJoin.JoinSupport
|
|
public void a(boolean z, Object obj) {
|
|
synchronized (this) {
|
|
this.b.a(z ? n : o, (Integer) obj);
|
|
}
|
|
b();
|
|
}
|
|
|
|
@Override // io.reactivex.internal.operators.observable.ObservableGroupJoin.JoinSupport
|
|
public void a(boolean z, LeftRightEndObserver leftRightEndObserver) {
|
|
synchronized (this) {
|
|
this.b.a(z ? p : q, (Integer) leftRightEndObserver);
|
|
}
|
|
b();
|
|
}
|
|
|
|
@Override // io.reactivex.internal.operators.observable.ObservableGroupJoin.JoinSupport
|
|
public void a(Throwable th) {
|
|
if (ExceptionHelper.a(this.f, th)) {
|
|
b();
|
|
} else {
|
|
RxJavaPlugins.b(th);
|
|
}
|
|
}
|
|
|
|
@Override // io.reactivex.internal.operators.observable.ObservableGroupJoin.JoinSupport
|
|
public void b(Throwable th) {
|
|
if (ExceptionHelper.a(this.f, th)) {
|
|
this.j.decrementAndGet();
|
|
b();
|
|
} else {
|
|
RxJavaPlugins.b(th);
|
|
}
|
|
}
|
|
}
|
|
|
|
interface JoinSupport {
|
|
void a(LeftRightObserver leftRightObserver);
|
|
|
|
void a(Throwable th);
|
|
|
|
void a(boolean z, LeftRightEndObserver leftRightEndObserver);
|
|
|
|
void a(boolean z, Object obj);
|
|
|
|
void b(Throwable th);
|
|
}
|
|
|
|
static final class LeftRightEndObserver extends AtomicReference<Disposable> implements Observer<Object>, Disposable {
|
|
final JoinSupport a;
|
|
final boolean b;
|
|
final int c;
|
|
|
|
LeftRightEndObserver(JoinSupport joinSupport, boolean z, int i) {
|
|
this.a = joinSupport;
|
|
this.b = z;
|
|
this.c = i;
|
|
}
|
|
|
|
@Override // io.reactivex.disposables.Disposable
|
|
public void dispose() {
|
|
DisposableHelper.dispose(this);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onComplete() {
|
|
this.a.a(this.b, this);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onError(Throwable th) {
|
|
this.a.a(th);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onNext(Object obj) {
|
|
if (DisposableHelper.dispose(this)) {
|
|
this.a.a(this.b, this);
|
|
}
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onSubscribe(Disposable disposable) {
|
|
DisposableHelper.setOnce(this, disposable);
|
|
}
|
|
}
|
|
|
|
static final class LeftRightObserver extends AtomicReference<Disposable> implements Observer<Object>, Disposable {
|
|
final JoinSupport a;
|
|
final boolean b;
|
|
|
|
LeftRightObserver(JoinSupport joinSupport, boolean z) {
|
|
this.a = joinSupport;
|
|
this.b = z;
|
|
}
|
|
|
|
@Override // io.reactivex.disposables.Disposable
|
|
public void dispose() {
|
|
DisposableHelper.dispose(this);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onComplete() {
|
|
this.a.a(this);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onError(Throwable th) {
|
|
this.a.b(th);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onNext(Object obj) {
|
|
this.a.a(this.b, obj);
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onSubscribe(Disposable disposable) {
|
|
DisposableHelper.setOnce(this, disposable);
|
|
}
|
|
}
|
|
|
|
public ObservableGroupJoin(ObservableSource<TLeft> observableSource, ObservableSource<? extends TRight> observableSource2, Function<? super TLeft, ? extends ObservableSource<TLeftEnd>> function, Function<? super TRight, ? extends ObservableSource<TRightEnd>> function2, BiFunction<? super TLeft, ? super Observable<TRight>, ? extends R> biFunction) {
|
|
super(observableSource);
|
|
this.b = observableSource2;
|
|
this.c = function;
|
|
this.d = function2;
|
|
this.e = biFunction;
|
|
}
|
|
|
|
@Override // io.reactivex.Observable
|
|
protected void subscribeActual(Observer<? super R> observer) {
|
|
GroupJoinDisposable groupJoinDisposable = new GroupJoinDisposable(observer, this.c, this.d, this.e);
|
|
observer.onSubscribe(groupJoinDisposable);
|
|
LeftRightObserver leftRightObserver = new LeftRightObserver(groupJoinDisposable, true);
|
|
groupJoinDisposable.c.b(leftRightObserver);
|
|
LeftRightObserver leftRightObserver2 = new LeftRightObserver(groupJoinDisposable, false);
|
|
groupJoinDisposable.c.b(leftRightObserver2);
|
|
this.a.subscribe(leftRightObserver);
|
|
this.b.subscribe(leftRightObserver2);
|
|
}
|
|
}
|