ADD week 5
This commit is contained in:
		| @@ -0,0 +1,16 @@ | ||||
| package androidx.concurrent.futures; | ||||
|  | ||||
| import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; | ||||
|  | ||||
| /* compiled from: D8$$SyntheticClass */ | ||||
| /* loaded from: classes.dex */ | ||||
| public final /* synthetic */ class AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0 { | ||||
|     public static /* synthetic */ boolean m(AtomicReferenceFieldUpdater atomicReferenceFieldUpdater, Object obj, Object obj2, Object obj3) { | ||||
|         while (!atomicReferenceFieldUpdater.compareAndSet(obj, obj2, obj3)) { | ||||
|             if (atomicReferenceFieldUpdater.get(obj) != obj2) { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,725 @@ | ||||
| package androidx.concurrent.futures; | ||||
|  | ||||
| import com.google.common.util.concurrent.ListenableFuture; | ||||
| import java.util.Locale; | ||||
| import java.util.concurrent.CancellationException; | ||||
| import java.util.concurrent.ExecutionException; | ||||
| import java.util.concurrent.Executor; | ||||
| import java.util.concurrent.Future; | ||||
| import java.util.concurrent.ScheduledFuture; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.concurrent.TimeoutException; | ||||
| import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; | ||||
| import java.util.concurrent.locks.LockSupport; | ||||
| import java.util.logging.Level; | ||||
| import java.util.logging.Logger; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public abstract class AbstractResolvableFuture<V> implements ListenableFuture<V> { | ||||
|     static final AtomicHelper ATOMIC_HELPER; | ||||
|     private static final Object NULL; | ||||
|     private static final long SPIN_THRESHOLD_NANOS = 1000; | ||||
|     volatile Listener listeners; | ||||
|     volatile Object value; | ||||
|     volatile Waiter waiters; | ||||
|     static final boolean GENERATE_CANCELLATION_CAUSES = Boolean.parseBoolean(System.getProperty("guava.concurrent.generate_cancellation_cause", "false")); | ||||
|     private static final Logger log = Logger.getLogger(AbstractResolvableFuture.class.getName()); | ||||
|  | ||||
|     protected void afterDone() { | ||||
|     } | ||||
|  | ||||
|     protected void interruptTask() { | ||||
|     } | ||||
|  | ||||
|     static { | ||||
|         AtomicHelper synchronizedHelper; | ||||
|         try { | ||||
|             synchronizedHelper = new SafeAtomicHelper(AtomicReferenceFieldUpdater.newUpdater(Waiter.class, Thread.class, "thread"), AtomicReferenceFieldUpdater.newUpdater(Waiter.class, Waiter.class, "next"), AtomicReferenceFieldUpdater.newUpdater(AbstractResolvableFuture.class, Waiter.class, "waiters"), AtomicReferenceFieldUpdater.newUpdater(AbstractResolvableFuture.class, Listener.class, "listeners"), AtomicReferenceFieldUpdater.newUpdater(AbstractResolvableFuture.class, Object.class, "value")); | ||||
|             th = null; | ||||
|         } catch (Throwable th) { | ||||
|             th = th; | ||||
|             synchronizedHelper = new SynchronizedHelper(); | ||||
|         } | ||||
|         ATOMIC_HELPER = synchronizedHelper; | ||||
|         if (th != null) { | ||||
|             log.log(Level.SEVERE, "SafeAtomicHelper is broken!", th); | ||||
|         } | ||||
|         NULL = new Object(); | ||||
|     } | ||||
|  | ||||
|     private static final class Waiter { | ||||
|         static final Waiter TOMBSTONE = new Waiter(false); | ||||
|         volatile Waiter next; | ||||
|         volatile Thread thread; | ||||
|  | ||||
|         Waiter(boolean z) { | ||||
|         } | ||||
|  | ||||
|         Waiter() { | ||||
|             AbstractResolvableFuture.ATOMIC_HELPER.putThread(this, Thread.currentThread()); | ||||
|         } | ||||
|  | ||||
|         void setNext(Waiter waiter) { | ||||
|             AbstractResolvableFuture.ATOMIC_HELPER.putNext(this, waiter); | ||||
|         } | ||||
|  | ||||
|         void unpark() { | ||||
|             Thread thread = this.thread; | ||||
|             if (thread != null) { | ||||
|                 this.thread = null; | ||||
|                 LockSupport.unpark(thread); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void removeWaiter(Waiter waiter) { | ||||
|         waiter.thread = null; | ||||
|         while (true) { | ||||
|             Waiter waiter2 = this.waiters; | ||||
|             if (waiter2 == Waiter.TOMBSTONE) { | ||||
|                 return; | ||||
|             } | ||||
|             Waiter waiter3 = null; | ||||
|             while (waiter2 != null) { | ||||
|                 Waiter waiter4 = waiter2.next; | ||||
|                 if (waiter2.thread != null) { | ||||
|                     waiter3 = waiter2; | ||||
|                 } else if (waiter3 != null) { | ||||
|                     waiter3.next = waiter4; | ||||
|                     if (waiter3.thread == null) { | ||||
|                         break; | ||||
|                     } | ||||
|                 } else if (!ATOMIC_HELPER.casWaiters(this, waiter2, waiter4)) { | ||||
|                     break; | ||||
|                 } | ||||
|                 waiter2 = waiter4; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class Listener { | ||||
|         static final Listener TOMBSTONE = new Listener(null, null); | ||||
|         final Executor executor; | ||||
|         Listener next; | ||||
|         final Runnable task; | ||||
|  | ||||
|         Listener(Runnable runnable, Executor executor) { | ||||
|             this.task = runnable; | ||||
|             this.executor = executor; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class Failure { | ||||
|         static final Failure FALLBACK_INSTANCE = new Failure(new Throwable("Failure occurred while trying to finish a future.") { // from class: androidx.concurrent.futures.AbstractResolvableFuture.Failure.1 | ||||
|             @Override // java.lang.Throwable | ||||
|             public synchronized Throwable fillInStackTrace() { | ||||
|                 return this; | ||||
|             } | ||||
|         }); | ||||
|         final Throwable exception; | ||||
|  | ||||
|         Failure(Throwable th) { | ||||
|             this.exception = (Throwable) AbstractResolvableFuture.checkNotNull(th); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class Cancellation { | ||||
|         static final Cancellation CAUSELESS_CANCELLED; | ||||
|         static final Cancellation CAUSELESS_INTERRUPTED; | ||||
|         final Throwable cause; | ||||
|         final boolean wasInterrupted; | ||||
|  | ||||
|         static { | ||||
|             if (AbstractResolvableFuture.GENERATE_CANCELLATION_CAUSES) { | ||||
|                 CAUSELESS_CANCELLED = null; | ||||
|                 CAUSELESS_INTERRUPTED = null; | ||||
|             } else { | ||||
|                 CAUSELESS_CANCELLED = new Cancellation(false, null); | ||||
|                 CAUSELESS_INTERRUPTED = new Cancellation(true, null); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         Cancellation(boolean z, Throwable th) { | ||||
|             this.wasInterrupted = z; | ||||
|             this.cause = th; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class SetFuture<V> implements Runnable { | ||||
|         final ListenableFuture<? extends V> future; | ||||
|         final AbstractResolvableFuture<V> owner; | ||||
|  | ||||
|         SetFuture(AbstractResolvableFuture<V> abstractResolvableFuture, ListenableFuture<? extends V> listenableFuture) { | ||||
|             this.owner = abstractResolvableFuture; | ||||
|             this.future = listenableFuture; | ||||
|         } | ||||
|  | ||||
|         @Override // java.lang.Runnable | ||||
|         public void run() { | ||||
|             if (this.owner.value != this) { | ||||
|                 return; | ||||
|             } | ||||
|             if (AbstractResolvableFuture.ATOMIC_HELPER.casValue(this.owner, this, AbstractResolvableFuture.getFutureValue(this.future))) { | ||||
|                 AbstractResolvableFuture.complete(this.owner); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected AbstractResolvableFuture() { | ||||
|     } | ||||
|  | ||||
|     @Override // java.util.concurrent.Future | ||||
|     public final V get(long j, TimeUnit timeUnit) throws InterruptedException, TimeoutException, ExecutionException { | ||||
|         long nanos = timeUnit.toNanos(j); | ||||
|         if (Thread.interrupted()) { | ||||
|             throw new InterruptedException(); | ||||
|         } | ||||
|         Object obj = this.value; | ||||
|         if ((obj != null) & (!(obj instanceof SetFuture))) { | ||||
|             return getDoneValue(obj); | ||||
|         } | ||||
|         long nanoTime = nanos > 0 ? System.nanoTime() + nanos : 0L; | ||||
|         if (nanos >= SPIN_THRESHOLD_NANOS) { | ||||
|             Waiter waiter = this.waiters; | ||||
|             if (waiter != Waiter.TOMBSTONE) { | ||||
|                 Waiter waiter2 = new Waiter(); | ||||
|                 do { | ||||
|                     waiter2.setNext(waiter); | ||||
|                     if (ATOMIC_HELPER.casWaiters(this, waiter, waiter2)) { | ||||
|                         do { | ||||
|                             LockSupport.parkNanos(this, nanos); | ||||
|                             if (Thread.interrupted()) { | ||||
|                                 removeWaiter(waiter2); | ||||
|                                 throw new InterruptedException(); | ||||
|                             } | ||||
|                             Object obj2 = this.value; | ||||
|                             if ((obj2 != null) & (!(obj2 instanceof SetFuture))) { | ||||
|                                 return getDoneValue(obj2); | ||||
|                             } | ||||
|                             nanos = nanoTime - System.nanoTime(); | ||||
|                         } while (nanos >= SPIN_THRESHOLD_NANOS); | ||||
|                         removeWaiter(waiter2); | ||||
|                     } else { | ||||
|                         waiter = this.waiters; | ||||
|                     } | ||||
|                 } while (waiter != Waiter.TOMBSTONE); | ||||
|             } | ||||
|             return getDoneValue(this.value); | ||||
|         } | ||||
|         while (nanos > 0) { | ||||
|             Object obj3 = this.value; | ||||
|             if ((obj3 != null) & (!(obj3 instanceof SetFuture))) { | ||||
|                 return getDoneValue(obj3); | ||||
|             } | ||||
|             if (Thread.interrupted()) { | ||||
|                 throw new InterruptedException(); | ||||
|             } | ||||
|             nanos = nanoTime - System.nanoTime(); | ||||
|         } | ||||
|         String abstractResolvableFuture = toString(); | ||||
|         String lowerCase = timeUnit.toString().toLowerCase(Locale.ROOT); | ||||
|         String str = "Waited " + j + " " + timeUnit.toString().toLowerCase(Locale.ROOT); | ||||
|         if (nanos + SPIN_THRESHOLD_NANOS < 0) { | ||||
|             String str2 = str + " (plus "; | ||||
|             long j2 = -nanos; | ||||
|             long convert = timeUnit.convert(j2, TimeUnit.NANOSECONDS); | ||||
|             long nanos2 = j2 - timeUnit.toNanos(convert); | ||||
|             boolean z = convert == 0 || nanos2 > SPIN_THRESHOLD_NANOS; | ||||
|             if (convert > 0) { | ||||
|                 String str3 = str2 + convert + " " + lowerCase; | ||||
|                 if (z) { | ||||
|                     str3 = str3 + ","; | ||||
|                 } | ||||
|                 str2 = str3 + " "; | ||||
|             } | ||||
|             if (z) { | ||||
|                 str2 = str2 + nanos2 + " nanoseconds "; | ||||
|             } | ||||
|             str = str2 + "delay)"; | ||||
|         } | ||||
|         if (isDone()) { | ||||
|             throw new TimeoutException(str + " but future completed as timeout expired"); | ||||
|         } | ||||
|         throw new TimeoutException(str + " for " + abstractResolvableFuture); | ||||
|     } | ||||
|  | ||||
|     @Override // java.util.concurrent.Future | ||||
|     public final V get() throws InterruptedException, ExecutionException { | ||||
|         Object obj; | ||||
|         if (Thread.interrupted()) { | ||||
|             throw new InterruptedException(); | ||||
|         } | ||||
|         Object obj2 = this.value; | ||||
|         if ((obj2 != null) & (!(obj2 instanceof SetFuture))) { | ||||
|             return getDoneValue(obj2); | ||||
|         } | ||||
|         Waiter waiter = this.waiters; | ||||
|         if (waiter != Waiter.TOMBSTONE) { | ||||
|             Waiter waiter2 = new Waiter(); | ||||
|             do { | ||||
|                 waiter2.setNext(waiter); | ||||
|                 if (ATOMIC_HELPER.casWaiters(this, waiter, waiter2)) { | ||||
|                     do { | ||||
|                         LockSupport.park(this); | ||||
|                         if (Thread.interrupted()) { | ||||
|                             removeWaiter(waiter2); | ||||
|                             throw new InterruptedException(); | ||||
|                         } | ||||
|                         obj = this.value; | ||||
|                     } while (!((obj != null) & (!(obj instanceof SetFuture)))); | ||||
|                     return getDoneValue(obj); | ||||
|                 } | ||||
|                 waiter = this.waiters; | ||||
|             } while (waiter != Waiter.TOMBSTONE); | ||||
|         } | ||||
|         return getDoneValue(this.value); | ||||
|     } | ||||
|  | ||||
|     /* JADX WARN: Multi-variable type inference failed */ | ||||
|     private V getDoneValue(Object obj) throws ExecutionException { | ||||
|         if (obj instanceof Cancellation) { | ||||
|             throw cancellationExceptionWithCause("Task was cancelled.", ((Cancellation) obj).cause); | ||||
|         } | ||||
|         if (obj instanceof Failure) { | ||||
|             throw new ExecutionException(((Failure) obj).exception); | ||||
|         } | ||||
|         if (obj == NULL) { | ||||
|             return null; | ||||
|         } | ||||
|         return obj; | ||||
|     } | ||||
|  | ||||
|     @Override // java.util.concurrent.Future | ||||
|     public final boolean isDone() { | ||||
|         return (!(r0 instanceof SetFuture)) & (this.value != null); | ||||
|     } | ||||
|  | ||||
|     @Override // java.util.concurrent.Future | ||||
|     public final boolean isCancelled() { | ||||
|         return this.value instanceof Cancellation; | ||||
|     } | ||||
|  | ||||
|     @Override // java.util.concurrent.Future | ||||
|     public final boolean cancel(boolean z) { | ||||
|         Cancellation cancellation; | ||||
|         Object obj = this.value; | ||||
|         if (!(obj == null) && !(obj instanceof SetFuture)) { | ||||
|             return false; | ||||
|         } | ||||
|         if (GENERATE_CANCELLATION_CAUSES) { | ||||
|             cancellation = new Cancellation(z, new CancellationException("Future.cancel() was called.")); | ||||
|         } else if (z) { | ||||
|             cancellation = Cancellation.CAUSELESS_INTERRUPTED; | ||||
|         } else { | ||||
|             cancellation = Cancellation.CAUSELESS_CANCELLED; | ||||
|         } | ||||
|         boolean z2 = false; | ||||
|         AbstractResolvableFuture<V> abstractResolvableFuture = this; | ||||
|         while (true) { | ||||
|             if (ATOMIC_HELPER.casValue(abstractResolvableFuture, obj, cancellation)) { | ||||
|                 if (z) { | ||||
|                     abstractResolvableFuture.interruptTask(); | ||||
|                 } | ||||
|                 complete(abstractResolvableFuture); | ||||
|                 if (!(obj instanceof SetFuture)) { | ||||
|                     return true; | ||||
|                 } | ||||
|                 ListenableFuture<? extends V> listenableFuture = ((SetFuture) obj).future; | ||||
|                 if (listenableFuture instanceof AbstractResolvableFuture) { | ||||
|                     abstractResolvableFuture = (AbstractResolvableFuture) listenableFuture; | ||||
|                     obj = abstractResolvableFuture.value; | ||||
|                     if (!(obj == null) && !(obj instanceof SetFuture)) { | ||||
|                         return true; | ||||
|                     } | ||||
|                     z2 = true; | ||||
|                 } else { | ||||
|                     listenableFuture.cancel(z); | ||||
|                     return true; | ||||
|                 } | ||||
|             } else { | ||||
|                 obj = abstractResolvableFuture.value; | ||||
|                 if (!(obj instanceof SetFuture)) { | ||||
|                     return z2; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected final boolean wasInterrupted() { | ||||
|         Object obj = this.value; | ||||
|         return (obj instanceof Cancellation) && ((Cancellation) obj).wasInterrupted; | ||||
|     } | ||||
|  | ||||
|     @Override // com.google.common.util.concurrent.ListenableFuture | ||||
|     public final void addListener(Runnable runnable, Executor executor) { | ||||
|         checkNotNull(runnable); | ||||
|         checkNotNull(executor); | ||||
|         Listener listener = this.listeners; | ||||
|         if (listener != Listener.TOMBSTONE) { | ||||
|             Listener listener2 = new Listener(runnable, executor); | ||||
|             do { | ||||
|                 listener2.next = listener; | ||||
|                 if (ATOMIC_HELPER.casListeners(this, listener, listener2)) { | ||||
|                     return; | ||||
|                 } else { | ||||
|                     listener = this.listeners; | ||||
|                 } | ||||
|             } while (listener != Listener.TOMBSTONE); | ||||
|         } | ||||
|         executeListener(runnable, executor); | ||||
|     } | ||||
|  | ||||
|     protected boolean set(V v) { | ||||
|         if (v == null) { | ||||
|             v = (V) NULL; | ||||
|         } | ||||
|         if (!ATOMIC_HELPER.casValue(this, null, v)) { | ||||
|             return false; | ||||
|         } | ||||
|         complete(this); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     protected boolean setException(Throwable th) { | ||||
|         if (!ATOMIC_HELPER.casValue(this, null, new Failure((Throwable) checkNotNull(th)))) { | ||||
|             return false; | ||||
|         } | ||||
|         complete(this); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     protected boolean setFuture(ListenableFuture<? extends V> listenableFuture) { | ||||
|         Failure failure; | ||||
|         checkNotNull(listenableFuture); | ||||
|         Object obj = this.value; | ||||
|         if (obj == null) { | ||||
|             if (listenableFuture.isDone()) { | ||||
|                 if (!ATOMIC_HELPER.casValue(this, null, getFutureValue(listenableFuture))) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 complete(this); | ||||
|                 return true; | ||||
|             } | ||||
|             SetFuture setFuture = new SetFuture(this, listenableFuture); | ||||
|             if (ATOMIC_HELPER.casValue(this, null, setFuture)) { | ||||
|                 try { | ||||
|                     listenableFuture.addListener(setFuture, DirectExecutor.INSTANCE); | ||||
|                 } catch (Throwable th) { | ||||
|                     try { | ||||
|                         failure = new Failure(th); | ||||
|                     } catch (Throwable unused) { | ||||
|                         failure = Failure.FALLBACK_INSTANCE; | ||||
|                     } | ||||
|                     ATOMIC_HELPER.casValue(this, setFuture, failure); | ||||
|                 } | ||||
|                 return true; | ||||
|             } | ||||
|             obj = this.value; | ||||
|         } | ||||
|         if (obj instanceof Cancellation) { | ||||
|             listenableFuture.cancel(((Cancellation) obj).wasInterrupted); | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     static Object getFutureValue(ListenableFuture<?> listenableFuture) { | ||||
|         if (listenableFuture instanceof AbstractResolvableFuture) { | ||||
|             Object obj = ((AbstractResolvableFuture) listenableFuture).value; | ||||
|             if (!(obj instanceof Cancellation)) { | ||||
|                 return obj; | ||||
|             } | ||||
|             Cancellation cancellation = (Cancellation) obj; | ||||
|             return cancellation.wasInterrupted ? cancellation.cause != null ? new Cancellation(false, cancellation.cause) : Cancellation.CAUSELESS_CANCELLED : obj; | ||||
|         } | ||||
|         boolean isCancelled = listenableFuture.isCancelled(); | ||||
|         if ((!GENERATE_CANCELLATION_CAUSES) & isCancelled) { | ||||
|             return Cancellation.CAUSELESS_CANCELLED; | ||||
|         } | ||||
|         try { | ||||
|             Object uninterruptibly = getUninterruptibly(listenableFuture); | ||||
|             return uninterruptibly == null ? NULL : uninterruptibly; | ||||
|         } catch (CancellationException e) { | ||||
|             if (!isCancelled) { | ||||
|                 return new Failure(new IllegalArgumentException("get() threw CancellationException, despite reporting isCancelled() == false: " + listenableFuture, e)); | ||||
|             } | ||||
|             return new Cancellation(false, e); | ||||
|         } catch (ExecutionException e2) { | ||||
|             return new Failure(e2.getCause()); | ||||
|         } catch (Throwable th) { | ||||
|             return new Failure(th); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static <V> V getUninterruptibly(Future<V> future) throws ExecutionException { | ||||
|         V v; | ||||
|         boolean z = false; | ||||
|         while (true) { | ||||
|             try { | ||||
|                 v = future.get(); | ||||
|                 break; | ||||
|             } catch (InterruptedException unused) { | ||||
|                 z = true; | ||||
|             } catch (Throwable th) { | ||||
|                 if (z) { | ||||
|                     Thread.currentThread().interrupt(); | ||||
|                 } | ||||
|                 throw th; | ||||
|             } | ||||
|         } | ||||
|         if (z) { | ||||
|             Thread.currentThread().interrupt(); | ||||
|         } | ||||
|         return v; | ||||
|     } | ||||
|  | ||||
|     static void complete(AbstractResolvableFuture<?> abstractResolvableFuture) { | ||||
|         Listener listener = null; | ||||
|         while (true) { | ||||
|             abstractResolvableFuture.releaseWaiters(); | ||||
|             abstractResolvableFuture.afterDone(); | ||||
|             Listener clearListeners = abstractResolvableFuture.clearListeners(listener); | ||||
|             while (clearListeners != null) { | ||||
|                 listener = clearListeners.next; | ||||
|                 Runnable runnable = clearListeners.task; | ||||
|                 if (runnable instanceof SetFuture) { | ||||
|                     SetFuture setFuture = (SetFuture) runnable; | ||||
|                     abstractResolvableFuture = setFuture.owner; | ||||
|                     if (abstractResolvableFuture.value == setFuture) { | ||||
|                         if (ATOMIC_HELPER.casValue(abstractResolvableFuture, setFuture, getFutureValue(setFuture.future))) { | ||||
|                             break; | ||||
|                         } | ||||
|                     } else { | ||||
|                         continue; | ||||
|                     } | ||||
|                 } else { | ||||
|                     executeListener(runnable, clearListeners.executor); | ||||
|                 } | ||||
|                 clearListeners = listener; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     final void maybePropagateCancellationTo(Future<?> future) { | ||||
|         if ((future != null) && isCancelled()) { | ||||
|             future.cancel(wasInterrupted()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void releaseWaiters() { | ||||
|         Waiter waiter; | ||||
|         do { | ||||
|             waiter = this.waiters; | ||||
|         } while (!ATOMIC_HELPER.casWaiters(this, waiter, Waiter.TOMBSTONE)); | ||||
|         while (waiter != null) { | ||||
|             waiter.unpark(); | ||||
|             waiter = waiter.next; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private Listener clearListeners(Listener listener) { | ||||
|         Listener listener2; | ||||
|         do { | ||||
|             listener2 = this.listeners; | ||||
|         } while (!ATOMIC_HELPER.casListeners(this, listener2, Listener.TOMBSTONE)); | ||||
|         Listener listener3 = listener; | ||||
|         Listener listener4 = listener2; | ||||
|         while (listener4 != null) { | ||||
|             Listener listener5 = listener4.next; | ||||
|             listener4.next = listener3; | ||||
|             listener3 = listener4; | ||||
|             listener4 = listener5; | ||||
|         } | ||||
|         return listener3; | ||||
|     } | ||||
|  | ||||
|     public String toString() { | ||||
|         String str; | ||||
|         StringBuilder sb = new StringBuilder(); | ||||
|         sb.append(super.toString()); | ||||
|         sb.append("[status="); | ||||
|         if (isCancelled()) { | ||||
|             sb.append("CANCELLED"); | ||||
|         } else if (isDone()) { | ||||
|             addDoneString(sb); | ||||
|         } else { | ||||
|             try { | ||||
|                 str = pendingToString(); | ||||
|             } catch (RuntimeException e) { | ||||
|                 str = "Exception thrown from implementation: " + e.getClass(); | ||||
|             } | ||||
|             if (str != null && !str.isEmpty()) { | ||||
|                 sb.append("PENDING, info=["); | ||||
|                 sb.append(str); | ||||
|                 sb.append("]"); | ||||
|             } else if (isDone()) { | ||||
|                 addDoneString(sb); | ||||
|             } else { | ||||
|                 sb.append("PENDING"); | ||||
|             } | ||||
|         } | ||||
|         sb.append("]"); | ||||
|         return sb.toString(); | ||||
|     } | ||||
|  | ||||
|     /* JADX WARN: Multi-variable type inference failed */ | ||||
|     protected String pendingToString() { | ||||
|         Object obj = this.value; | ||||
|         if (obj instanceof SetFuture) { | ||||
|             return "setFuture=[" + userObjectToString(((SetFuture) obj).future) + "]"; | ||||
|         } | ||||
|         if (!(this instanceof ScheduledFuture)) { | ||||
|             return null; | ||||
|         } | ||||
|         return "remaining delay=[" + ((ScheduledFuture) this).getDelay(TimeUnit.MILLISECONDS) + " ms]"; | ||||
|     } | ||||
|  | ||||
|     private void addDoneString(StringBuilder sb) { | ||||
|         try { | ||||
|             Object uninterruptibly = getUninterruptibly(this); | ||||
|             sb.append("SUCCESS, result=["); | ||||
|             sb.append(userObjectToString(uninterruptibly)); | ||||
|             sb.append("]"); | ||||
|         } catch (CancellationException unused) { | ||||
|             sb.append("CANCELLED"); | ||||
|         } catch (RuntimeException e) { | ||||
|             sb.append("UNKNOWN, cause=["); | ||||
|             sb.append(e.getClass()); | ||||
|             sb.append(" thrown from get()]"); | ||||
|         } catch (ExecutionException e2) { | ||||
|             sb.append("FAILURE, cause=["); | ||||
|             sb.append(e2.getCause()); | ||||
|             sb.append("]"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private String userObjectToString(Object obj) { | ||||
|         return obj == this ? "this future" : String.valueOf(obj); | ||||
|     } | ||||
|  | ||||
|     private static void executeListener(Runnable runnable, Executor executor) { | ||||
|         try { | ||||
|             executor.execute(runnable); | ||||
|         } catch (RuntimeException e) { | ||||
|             log.log(Level.SEVERE, "RuntimeException while executing runnable " + runnable + " with executor " + executor, (Throwable) e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static abstract class AtomicHelper { | ||||
|         abstract boolean casListeners(AbstractResolvableFuture<?> abstractResolvableFuture, Listener listener, Listener listener2); | ||||
|  | ||||
|         abstract boolean casValue(AbstractResolvableFuture<?> abstractResolvableFuture, Object obj, Object obj2); | ||||
|  | ||||
|         abstract boolean casWaiters(AbstractResolvableFuture<?> abstractResolvableFuture, Waiter waiter, Waiter waiter2); | ||||
|  | ||||
|         abstract void putNext(Waiter waiter, Waiter waiter2); | ||||
|  | ||||
|         abstract void putThread(Waiter waiter, Thread thread); | ||||
|  | ||||
|         private AtomicHelper() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class SafeAtomicHelper extends AtomicHelper { | ||||
|         final AtomicReferenceFieldUpdater<AbstractResolvableFuture, Listener> listenersUpdater; | ||||
|         final AtomicReferenceFieldUpdater<AbstractResolvableFuture, Object> valueUpdater; | ||||
|         final AtomicReferenceFieldUpdater<Waiter, Waiter> waiterNextUpdater; | ||||
|         final AtomicReferenceFieldUpdater<Waiter, Thread> waiterThreadUpdater; | ||||
|         final AtomicReferenceFieldUpdater<AbstractResolvableFuture, Waiter> waitersUpdater; | ||||
|  | ||||
|         SafeAtomicHelper(AtomicReferenceFieldUpdater<Waiter, Thread> atomicReferenceFieldUpdater, AtomicReferenceFieldUpdater<Waiter, Waiter> atomicReferenceFieldUpdater2, AtomicReferenceFieldUpdater<AbstractResolvableFuture, Waiter> atomicReferenceFieldUpdater3, AtomicReferenceFieldUpdater<AbstractResolvableFuture, Listener> atomicReferenceFieldUpdater4, AtomicReferenceFieldUpdater<AbstractResolvableFuture, Object> atomicReferenceFieldUpdater5) { | ||||
|             super(); | ||||
|             this.waiterThreadUpdater = atomicReferenceFieldUpdater; | ||||
|             this.waiterNextUpdater = atomicReferenceFieldUpdater2; | ||||
|             this.waitersUpdater = atomicReferenceFieldUpdater3; | ||||
|             this.listenersUpdater = atomicReferenceFieldUpdater4; | ||||
|             this.valueUpdater = atomicReferenceFieldUpdater5; | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         void putThread(Waiter waiter, Thread thread) { | ||||
|             this.waiterThreadUpdater.lazySet(waiter, thread); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         void putNext(Waiter waiter, Waiter waiter2) { | ||||
|             this.waiterNextUpdater.lazySet(waiter, waiter2); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         boolean casWaiters(AbstractResolvableFuture<?> abstractResolvableFuture, Waiter waiter, Waiter waiter2) { | ||||
|             return AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0.m(this.waitersUpdater, abstractResolvableFuture, waiter, waiter2); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         boolean casListeners(AbstractResolvableFuture<?> abstractResolvableFuture, Listener listener, Listener listener2) { | ||||
|             return AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0.m(this.listenersUpdater, abstractResolvableFuture, listener, listener2); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         boolean casValue(AbstractResolvableFuture<?> abstractResolvableFuture, Object obj, Object obj2) { | ||||
|             return AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0.m(this.valueUpdater, abstractResolvableFuture, obj, obj2); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static final class SynchronizedHelper extends AtomicHelper { | ||||
|         SynchronizedHelper() { | ||||
|             super(); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         void putThread(Waiter waiter, Thread thread) { | ||||
|             waiter.thread = thread; | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         void putNext(Waiter waiter, Waiter waiter2) { | ||||
|             waiter.next = waiter2; | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         boolean casWaiters(AbstractResolvableFuture<?> abstractResolvableFuture, Waiter waiter, Waiter waiter2) { | ||||
|             synchronized (abstractResolvableFuture) { | ||||
|                 if (abstractResolvableFuture.waiters != waiter) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 abstractResolvableFuture.waiters = waiter2; | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         boolean casListeners(AbstractResolvableFuture<?> abstractResolvableFuture, Listener listener, Listener listener2) { | ||||
|             synchronized (abstractResolvableFuture) { | ||||
|                 if (abstractResolvableFuture.listeners != listener) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 abstractResolvableFuture.listeners = listener2; | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.concurrent.futures.AbstractResolvableFuture.AtomicHelper | ||||
|         boolean casValue(AbstractResolvableFuture<?> abstractResolvableFuture, Object obj, Object obj2) { | ||||
|             synchronized (abstractResolvableFuture) { | ||||
|                 if (abstractResolvableFuture.value != obj) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 abstractResolvableFuture.value = obj2; | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static CancellationException cancellationExceptionWithCause(String str, Throwable th) { | ||||
|         CancellationException cancellationException = new CancellationException(str); | ||||
|         cancellationException.initCause(th); | ||||
|         return cancellationException; | ||||
|     } | ||||
|  | ||||
|     static <T> T checkNotNull(T t) { | ||||
|         t.getClass(); | ||||
|         return t; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,186 @@ | ||||
| package androidx.concurrent.futures; | ||||
|  | ||||
| import com.google.common.util.concurrent.ListenableFuture; | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.util.concurrent.ExecutionException; | ||||
| import java.util.concurrent.Executor; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.concurrent.TimeoutException; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public final class CallbackToFutureAdapter { | ||||
|  | ||||
|     public interface Resolver<T> { | ||||
|         Object attachCompleter(Completer<T> completer) throws Exception; | ||||
|     } | ||||
|  | ||||
|     private CallbackToFutureAdapter() { | ||||
|     } | ||||
|  | ||||
|     public static <T> ListenableFuture<T> getFuture(Resolver<T> resolver) { | ||||
|         Completer<T> completer = new Completer<>(); | ||||
|         SafeFuture<T> safeFuture = new SafeFuture<>(completer); | ||||
|         completer.future = safeFuture; | ||||
|         completer.tag = resolver.getClass(); | ||||
|         try { | ||||
|             Object attachCompleter = resolver.attachCompleter(completer); | ||||
|             if (attachCompleter != null) { | ||||
|                 completer.tag = attachCompleter; | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             safeFuture.setException(e); | ||||
|         } | ||||
|         return safeFuture; | ||||
|     } | ||||
|  | ||||
|     private static final class SafeFuture<T> implements ListenableFuture<T> { | ||||
|         final WeakReference<Completer<T>> completerWeakReference; | ||||
|         private final AbstractResolvableFuture<T> delegate = new AbstractResolvableFuture<T>() { // from class: androidx.concurrent.futures.CallbackToFutureAdapter.SafeFuture.1 | ||||
|             @Override // androidx.concurrent.futures.AbstractResolvableFuture | ||||
|             protected String pendingToString() { | ||||
|                 Completer<T> completer = SafeFuture.this.completerWeakReference.get(); | ||||
|                 if (completer == null) { | ||||
|                     return "Completer object has been garbage collected, future will fail soon"; | ||||
|                 } | ||||
|                 return "tag=[" + completer.tag + "]"; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         SafeFuture(Completer<T> completer) { | ||||
|             this.completerWeakReference = new WeakReference<>(completer); | ||||
|         } | ||||
|  | ||||
|         @Override // java.util.concurrent.Future | ||||
|         public boolean cancel(boolean z) { | ||||
|             Completer<T> completer = this.completerWeakReference.get(); | ||||
|             boolean cancel = this.delegate.cancel(z); | ||||
|             if (cancel && completer != null) { | ||||
|                 completer.fireCancellationListeners(); | ||||
|             } | ||||
|             return cancel; | ||||
|         } | ||||
|  | ||||
|         boolean cancelWithoutNotifyingCompleter(boolean z) { | ||||
|             return this.delegate.cancel(z); | ||||
|         } | ||||
|  | ||||
|         boolean set(T t) { | ||||
|             return this.delegate.set(t); | ||||
|         } | ||||
|  | ||||
|         boolean setException(Throwable th) { | ||||
|             return this.delegate.setException(th); | ||||
|         } | ||||
|  | ||||
|         @Override // java.util.concurrent.Future | ||||
|         public boolean isCancelled() { | ||||
|             return this.delegate.isCancelled(); | ||||
|         } | ||||
|  | ||||
|         @Override // java.util.concurrent.Future | ||||
|         public boolean isDone() { | ||||
|             return this.delegate.isDone(); | ||||
|         } | ||||
|  | ||||
|         @Override // java.util.concurrent.Future | ||||
|         public T get() throws InterruptedException, ExecutionException { | ||||
|             return this.delegate.get(); | ||||
|         } | ||||
|  | ||||
|         @Override // java.util.concurrent.Future | ||||
|         public T get(long j, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException { | ||||
|             return this.delegate.get(j, timeUnit); | ||||
|         } | ||||
|  | ||||
|         @Override // com.google.common.util.concurrent.ListenableFuture | ||||
|         public void addListener(Runnable runnable, Executor executor) { | ||||
|             this.delegate.addListener(runnable, executor); | ||||
|         } | ||||
|  | ||||
|         public String toString() { | ||||
|             return this.delegate.toString(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static final class Completer<T> { | ||||
|         private boolean attemptedSetting; | ||||
|         private ResolvableFuture<Void> cancellationFuture = ResolvableFuture.create(); | ||||
|         SafeFuture<T> future; | ||||
|         Object tag; | ||||
|  | ||||
|         private void setCompletedNormally() { | ||||
|             this.tag = null; | ||||
|             this.future = null; | ||||
|             this.cancellationFuture = null; | ||||
|         } | ||||
|  | ||||
|         Completer() { | ||||
|         } | ||||
|  | ||||
|         public boolean set(T t) { | ||||
|             this.attemptedSetting = true; | ||||
|             SafeFuture<T> safeFuture = this.future; | ||||
|             boolean z = safeFuture != null && safeFuture.set(t); | ||||
|             if (z) { | ||||
|                 setCompletedNormally(); | ||||
|             } | ||||
|             return z; | ||||
|         } | ||||
|  | ||||
|         public boolean setException(Throwable th) { | ||||
|             this.attemptedSetting = true; | ||||
|             SafeFuture<T> safeFuture = this.future; | ||||
|             boolean z = safeFuture != null && safeFuture.setException(th); | ||||
|             if (z) { | ||||
|                 setCompletedNormally(); | ||||
|             } | ||||
|             return z; | ||||
|         } | ||||
|  | ||||
|         public boolean setCancelled() { | ||||
|             this.attemptedSetting = true; | ||||
|             SafeFuture<T> safeFuture = this.future; | ||||
|             boolean z = safeFuture != null && safeFuture.cancelWithoutNotifyingCompleter(true); | ||||
|             if (z) { | ||||
|                 setCompletedNormally(); | ||||
|             } | ||||
|             return z; | ||||
|         } | ||||
|  | ||||
|         public void addCancellationListener(Runnable runnable, Executor executor) { | ||||
|             ResolvableFuture<Void> resolvableFuture = this.cancellationFuture; | ||||
|             if (resolvableFuture != null) { | ||||
|                 resolvableFuture.addListener(runnable, executor); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         void fireCancellationListeners() { | ||||
|             this.tag = null; | ||||
|             this.future = null; | ||||
|             this.cancellationFuture.set(null); | ||||
|         } | ||||
|  | ||||
|         protected void finalize() { | ||||
|             ResolvableFuture<Void> resolvableFuture; | ||||
|             SafeFuture<T> safeFuture = this.future; | ||||
|             if (safeFuture != null && !safeFuture.isDone()) { | ||||
|                 safeFuture.setException(new FutureGarbageCollectedException("The completer object was garbage collected - this future would otherwise never complete. The tag was: " + this.tag)); | ||||
|             } | ||||
|             if (this.attemptedSetting || (resolvableFuture = this.cancellationFuture) == null) { | ||||
|                 return; | ||||
|             } | ||||
|             resolvableFuture.set(null); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static final class FutureGarbageCollectedException extends Throwable { | ||||
|         FutureGarbageCollectedException(String str) { | ||||
|             super(str); | ||||
|         } | ||||
|  | ||||
|         @Override // java.lang.Throwable | ||||
|         public synchronized Throwable fillInStackTrace() { | ||||
|             return this; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| package androidx.concurrent.futures; | ||||
|  | ||||
| import java.util.concurrent.Executor; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public enum DirectExecutor implements Executor { | ||||
|     INSTANCE; | ||||
|  | ||||
|     @Override // java.lang.Enum | ||||
|     public String toString() { | ||||
|         return "DirectExecutor"; | ||||
|     } | ||||
|  | ||||
|     @Override // java.util.concurrent.Executor | ||||
|     public void execute(Runnable runnable) { | ||||
|         runnable.run(); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,28 @@ | ||||
| package androidx.concurrent.futures; | ||||
|  | ||||
| import com.google.common.util.concurrent.ListenableFuture; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public final class ResolvableFuture<V> extends AbstractResolvableFuture<V> { | ||||
|     public static <V> ResolvableFuture<V> create() { | ||||
|         return new ResolvableFuture<>(); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.concurrent.futures.AbstractResolvableFuture | ||||
|     public boolean set(V v) { | ||||
|         return super.set(v); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.concurrent.futures.AbstractResolvableFuture | ||||
|     public boolean setException(Throwable th) { | ||||
|         return super.setException(th); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.concurrent.futures.AbstractResolvableFuture | ||||
|     public boolean setFuture(ListenableFuture<? extends V> listenableFuture) { | ||||
|         return super.setFuture(listenableFuture); | ||||
|     } | ||||
|  | ||||
|     private ResolvableFuture() { | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user