jimu-decompiled/sources/io/reactivex/internal/schedulers/ScheduledRunnable.java
2025-05-13 19:24:51 +02:00

129 lines
4.0 KiB
Java

package io.reactivex.internal.schedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.internal.disposables.DisposableContainer;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicReferenceArray;
/* loaded from: classes2.dex */
public final class ScheduledRunnable extends AtomicReferenceArray<Object> implements Runnable, Callable<Object>, Disposable {
static final int FUTURE_INDEX = 1;
static final int PARENT_INDEX = 0;
static final int THREAD_INDEX = 2;
private static final long serialVersionUID = -6120223772001106981L;
final Runnable actual;
static final Object PARENT_DISPOSED = new Object();
static final Object SYNC_DISPOSED = new Object();
static final Object ASYNC_DISPOSED = new Object();
static final Object DONE = new Object();
public ScheduledRunnable(Runnable runnable, DisposableContainer disposableContainer) {
super(3);
this.actual = runnable;
lazySet(0, disposableContainer);
}
@Override // java.util.concurrent.Callable
public Object call() {
run();
return null;
}
@Override // io.reactivex.disposables.Disposable
public void dispose() {
Object obj;
Object obj2;
while (true) {
Object obj3 = get(1);
if (obj3 == DONE || obj3 == SYNC_DISPOSED || obj3 == ASYNC_DISPOSED) {
break;
}
boolean z = get(2) != Thread.currentThread();
if (compareAndSet(1, obj3, z ? ASYNC_DISPOSED : SYNC_DISPOSED)) {
if (obj3 != null) {
((Future) obj3).cancel(z);
}
}
}
do {
obj = get(0);
if (obj == DONE || obj == (obj2 = PARENT_DISPOSED) || obj == null) {
return;
}
} while (!compareAndSet(0, obj, obj2));
((DisposableContainer) obj).c(this);
}
public boolean isDisposed() {
Object obj = get(0);
return obj == PARENT_DISPOSED || obj == DONE;
}
@Override // java.lang.Runnable
public void run() {
Object obj;
Object obj2;
Object obj3;
boolean compareAndSet;
Object obj4;
Object obj5;
lazySet(2, Thread.currentThread());
try {
this.actual.run();
} finally {
try {
lazySet(2, null);
obj4 = get(0);
if (obj4 != PARENT_DISPOSED) {
((DisposableContainer) obj4).c(this);
}
do {
obj5 = get(1);
if (obj5 != SYNC_DISPOSED) {
return;
} else {
return;
}
} while (!compareAndSet(1, obj5, DONE));
} catch (Throwable th) {
do {
if (obj == obj2) {
break;
} else if (obj == obj3) {
break;
}
} while (!compareAndSet);
}
}
lazySet(2, null);
obj4 = get(0);
if (obj4 != PARENT_DISPOSED && compareAndSet(0, obj4, DONE) && obj4 != null) {
((DisposableContainer) obj4).c(this);
}
do {
obj5 = get(1);
if (obj5 != SYNC_DISPOSED || obj5 == ASYNC_DISPOSED) {
return;
}
} while (!compareAndSet(1, obj5, DONE));
}
public void setFuture(Future<?> future) {
Object obj;
do {
obj = get(1);
if (obj == DONE) {
return;
}
if (obj == SYNC_DISPOSED) {
future.cancel(false);
return;
} else if (obj == ASYNC_DISPOSED) {
future.cancel(true);
return;
}
} while (!compareAndSet(1, obj, future));
}
}