diff options
author | zachh <zachh@google.com> | 2017-12-07 17:54:53 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2017-12-07 18:34:18 -0800 |
commit | 36a384e04fd9b8ba1d53500afb7e0055e4e4bb99 (patch) | |
tree | 2f981389119f868fd90f3f49c44b01bfa891b257 | |
parent | 4f6307cd3784a53a76f3e51747bfb06866dad3b2 (diff) |
Fixed compile error in AOSP due to use of guava 23 API.
Futures.submitAsync is V23 and AOSP is currently stuck at V20.
This is just a completely non-sensical dummy implementation of DialerFutureSerializer until we can figure out what to do.
Test: tap
PiperOrigin-RevId: 178323108
Change-Id: I1dc2c8ddfa7ef3e15170543dadefbe4fc2e19226
-rw-r--r-- | java/com/android/dialer/common/concurrent/DialerFutureSerializer.java | 73 |
1 files changed, 7 insertions, 66 deletions
diff --git a/java/com/android/dialer/common/concurrent/DialerFutureSerializer.java b/java/com/android/dialer/common/concurrent/DialerFutureSerializer.java index 2629abbbe..de37a2915 100644 --- a/java/com/android/dialer/common/concurrent/DialerFutureSerializer.java +++ b/java/com/android/dialer/common/concurrent/DialerFutureSerializer.java @@ -16,83 +16,24 @@ package com.android.dialer.common.concurrent; -import static com.google.common.util.concurrent.Futures.immediateCancelledFuture; -import static com.google.common.util.concurrent.Futures.immediateFuture; -import static com.google.common.util.concurrent.MoreExecutors.directExecutor; - import com.google.common.util.concurrent.AsyncCallable; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; -import java.util.concurrent.Callable; import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; /** * Serializes execution of a set of operations. This class guarantees that a submitted callable will * not be called before previously submitted callables have completed. */ public final class DialerFutureSerializer { - /** This reference acts as a pointer tracking the head of a linked list of ListenableFutures. */ - private final AtomicReference<ListenableFuture<?>> ref = - new AtomicReference<>(immediateFuture(null)); /** Enqueues a task to run when the previous task (if any) completes. */ - public <T> ListenableFuture<T> submit(final Callable<T> callable, Executor executor) { - return submitAsync(() -> immediateFuture(callable.call()), executor); - } - - /** - * Enqueues a task to run when the previous task (if any) completes. - * - * <p>Cancellation does not propagate from the output future to the future returned from {@code - * callable}, but if the output future is cancelled before {@link AsyncCallable#call()} is - * invoked, {@link AsyncCallable#call()} will not be invoked. - */ public <T> ListenableFuture<T> submitAsync(final AsyncCallable<T> callable, Executor executor) { - AtomicBoolean wasCancelled = new AtomicBoolean(false); - final AsyncCallable<T> task = - () -> { - if (wasCancelled.get()) { - return immediateCancelledFuture(); - } - return callable.call(); - }; - /* - * Three futures are at play here: - * taskFuture is the future that comes from the callable. - * newFuture is the future we use to track the serialization of our task. - * oldFuture is the previous task's newFuture. - * - * newFuture is guaranteed to only complete once all tasks previously submitted to this instance - * once the futures returned from those submissions have completed. - */ - final SettableFuture<Object> newFuture = SettableFuture.create(); - - final ListenableFuture<?> oldFuture = ref.getAndSet(newFuture); - - // Invoke our task once the previous future completes. - final ListenableFuture<T> taskFuture = - Futures.nonCancellationPropagating( - Futures.submitAsync(task, runnable -> oldFuture.addListener(runnable, executor))); - // newFuture's lifetime is determined by taskFuture, unless taskFuture is cancelled, in which - // case it falls back to oldFuture's. This is to ensure that if the future we return is - // cancelled, we don't begin execution of the next task until after oldFuture completes. - taskFuture.addListener( - () -> { - if (taskFuture.isCancelled()) { - // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of a - // future that eventually came from immediateFuture(null), this doesn't leak throwables - // or completion values. - wasCancelled.set(true); - newFuture.setFuture(oldFuture); - } else { - newFuture.set(null); - } - }, - directExecutor()); - - return taskFuture; + // TODO(zachh): This is just a dummy implementation until we fix guava API level issues. + try { + return callable.call(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; } } |