226 lines
8.5 KiB
Java
226 lines
8.5 KiB
Java
package io.reactivex.internal.operators.observable;
|
|
|
|
import io.reactivex.ObservableSource;
|
|
import io.reactivex.Observer;
|
|
import io.reactivex.disposables.Disposable;
|
|
import io.reactivex.exceptions.Exceptions;
|
|
import io.reactivex.functions.Consumer;
|
|
import io.reactivex.internal.disposables.DisposableHelper;
|
|
import io.reactivex.internal.fuseable.HasUpstreamObservableSource;
|
|
import io.reactivex.internal.util.ExceptionHelper;
|
|
import io.reactivex.observables.ConnectableObservable;
|
|
import io.reactivex.plugins.RxJavaPlugins;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class ObservablePublish<T> extends ConnectableObservable<T> implements HasUpstreamObservableSource<T> {
|
|
final ObservableSource<T> a;
|
|
final AtomicReference<PublishObserver<T>> b;
|
|
final ObservableSource<T> c;
|
|
|
|
static final class InnerDisposable<T> extends AtomicReference<Object> implements Disposable {
|
|
final Observer<? super T> a;
|
|
|
|
InnerDisposable(Observer<? super T> observer) {
|
|
this.a = observer;
|
|
}
|
|
|
|
void a(PublishObserver<T> publishObserver) {
|
|
if (compareAndSet(null, publishObserver)) {
|
|
return;
|
|
}
|
|
publishObserver.b(this);
|
|
}
|
|
|
|
@Override // io.reactivex.disposables.Disposable
|
|
public void dispose() {
|
|
Object andSet = getAndSet(this);
|
|
if (andSet == null || andSet == this) {
|
|
return;
|
|
}
|
|
((PublishObserver) andSet).b(this);
|
|
}
|
|
}
|
|
|
|
static final class PublishObserver<T> implements Observer<T>, Disposable {
|
|
static final InnerDisposable[] e = new InnerDisposable[0];
|
|
static final InnerDisposable[] f = new InnerDisposable[0];
|
|
final AtomicReference<PublishObserver<T>> a;
|
|
final AtomicReference<Disposable> d = new AtomicReference<>();
|
|
final AtomicReference<InnerDisposable<T>[]> b = new AtomicReference<>(e);
|
|
final AtomicBoolean c = new AtomicBoolean();
|
|
|
|
PublishObserver(AtomicReference<PublishObserver<T>> atomicReference) {
|
|
this.a = atomicReference;
|
|
}
|
|
|
|
public boolean a() {
|
|
return this.b.get() == f;
|
|
}
|
|
|
|
void b(InnerDisposable<T> innerDisposable) {
|
|
InnerDisposable<T>[] innerDisposableArr;
|
|
InnerDisposable<T>[] innerDisposableArr2;
|
|
do {
|
|
innerDisposableArr = this.b.get();
|
|
int length = innerDisposableArr.length;
|
|
if (length == 0) {
|
|
return;
|
|
}
|
|
int i = -1;
|
|
int i2 = 0;
|
|
while (true) {
|
|
if (i2 >= length) {
|
|
break;
|
|
}
|
|
if (innerDisposableArr[i2].equals(innerDisposable)) {
|
|
i = i2;
|
|
break;
|
|
}
|
|
i2++;
|
|
}
|
|
if (i < 0) {
|
|
return;
|
|
}
|
|
if (length == 1) {
|
|
innerDisposableArr2 = e;
|
|
} else {
|
|
InnerDisposable<T>[] innerDisposableArr3 = new InnerDisposable[length - 1];
|
|
System.arraycopy(innerDisposableArr, 0, innerDisposableArr3, 0, i);
|
|
System.arraycopy(innerDisposableArr, i + 1, innerDisposableArr3, i, (length - i) - 1);
|
|
innerDisposableArr2 = innerDisposableArr3;
|
|
}
|
|
} while (!this.b.compareAndSet(innerDisposableArr, innerDisposableArr2));
|
|
}
|
|
|
|
@Override // io.reactivex.disposables.Disposable
|
|
public void dispose() {
|
|
if (this.b.getAndSet(f) != f) {
|
|
this.a.compareAndSet(this, null);
|
|
DisposableHelper.dispose(this.d);
|
|
}
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onComplete() {
|
|
this.a.compareAndSet(this, null);
|
|
for (InnerDisposable<T> innerDisposable : this.b.getAndSet(f)) {
|
|
innerDisposable.a.onComplete();
|
|
}
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onError(Throwable th) {
|
|
this.a.compareAndSet(this, null);
|
|
InnerDisposable<T>[] andSet = this.b.getAndSet(f);
|
|
if (andSet.length == 0) {
|
|
RxJavaPlugins.b(th);
|
|
return;
|
|
}
|
|
for (InnerDisposable<T> innerDisposable : andSet) {
|
|
innerDisposable.a.onError(th);
|
|
}
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onNext(T t) {
|
|
for (InnerDisposable<T> innerDisposable : this.b.get()) {
|
|
innerDisposable.a.onNext(t);
|
|
}
|
|
}
|
|
|
|
@Override // io.reactivex.Observer
|
|
public void onSubscribe(Disposable disposable) {
|
|
DisposableHelper.setOnce(this.d, disposable);
|
|
}
|
|
|
|
boolean a(InnerDisposable<T> innerDisposable) {
|
|
InnerDisposable<T>[] innerDisposableArr;
|
|
InnerDisposable<T>[] innerDisposableArr2;
|
|
do {
|
|
innerDisposableArr = this.b.get();
|
|
if (innerDisposableArr == f) {
|
|
return false;
|
|
}
|
|
int length = innerDisposableArr.length;
|
|
innerDisposableArr2 = new InnerDisposable[length + 1];
|
|
System.arraycopy(innerDisposableArr, 0, innerDisposableArr2, 0, length);
|
|
innerDisposableArr2[length] = innerDisposable;
|
|
} while (!this.b.compareAndSet(innerDisposableArr, innerDisposableArr2));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
static final class PublishSource<T> implements ObservableSource<T> {
|
|
private final AtomicReference<PublishObserver<T>> a;
|
|
|
|
PublishSource(AtomicReference<PublishObserver<T>> atomicReference) {
|
|
this.a = atomicReference;
|
|
}
|
|
|
|
@Override // io.reactivex.ObservableSource
|
|
public void subscribe(Observer<? super T> observer) {
|
|
InnerDisposable innerDisposable = new InnerDisposable(observer);
|
|
observer.onSubscribe(innerDisposable);
|
|
while (true) {
|
|
PublishObserver<T> publishObserver = this.a.get();
|
|
if (publishObserver == null || publishObserver.a()) {
|
|
PublishObserver<T> publishObserver2 = new PublishObserver<>(this.a);
|
|
if (this.a.compareAndSet(publishObserver, publishObserver2)) {
|
|
publishObserver = publishObserver2;
|
|
} else {
|
|
continue;
|
|
}
|
|
}
|
|
if (publishObserver.a(innerDisposable)) {
|
|
innerDisposable.a(publishObserver);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private ObservablePublish(ObservableSource<T> observableSource, ObservableSource<T> observableSource2, AtomicReference<PublishObserver<T>> atomicReference) {
|
|
this.c = observableSource;
|
|
this.a = observableSource2;
|
|
this.b = atomicReference;
|
|
}
|
|
|
|
public static <T> ConnectableObservable<T> a(ObservableSource<T> observableSource) {
|
|
AtomicReference atomicReference = new AtomicReference();
|
|
return RxJavaPlugins.a((ConnectableObservable) new ObservablePublish(new PublishSource(atomicReference), observableSource, atomicReference));
|
|
}
|
|
|
|
@Override // io.reactivex.Observable
|
|
protected void subscribeActual(Observer<? super T> observer) {
|
|
this.c.subscribe(observer);
|
|
}
|
|
|
|
@Override // io.reactivex.observables.ConnectableObservable
|
|
public void a(Consumer<? super Disposable> consumer) {
|
|
PublishObserver<T> publishObserver;
|
|
while (true) {
|
|
publishObserver = this.b.get();
|
|
if (publishObserver != null && !publishObserver.a()) {
|
|
break;
|
|
}
|
|
PublishObserver<T> publishObserver2 = new PublishObserver<>(this.b);
|
|
if (this.b.compareAndSet(publishObserver, publishObserver2)) {
|
|
publishObserver = publishObserver2;
|
|
break;
|
|
}
|
|
}
|
|
boolean z = !publishObserver.c.get() && publishObserver.c.compareAndSet(false, true);
|
|
try {
|
|
consumer.accept(publishObserver);
|
|
if (z) {
|
|
this.a.subscribe(publishObserver);
|
|
}
|
|
} catch (Throwable th) {
|
|
Exceptions.b(th);
|
|
throw ExceptionHelper.a(th);
|
|
}
|
|
}
|
|
}
|