Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6aeabfe3 authored by Adam Lesinski's avatar Adam Lesinski Committed by android-build-merger
Browse files

Merge "BatteryStats: Don't schedule work when shutting down" into oc-mr1-dev am: 4a8f95ba

am: aa8ed4fe

Change-Id: I508891330306fe23e4ab66367bea3f5b2c045dea
parents 8a4444c8 aa8ed4fe
Loading
Loading
Loading
Loading
+12 −1
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.internal.os.BatteryStatsImpl;


import libcore.util.EmptyArray;
import libcore.util.EmptyArray;


import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Future;
@@ -116,6 +117,10 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
    }
    }


    public synchronized Future<?> scheduleWrite() {
    public synchronized Future<?> scheduleWrite() {
        if (mExecutorService.isShutdown()) {
            return CompletableFuture.failedFuture(new IllegalStateException("worker shutdown"));
        }

        scheduleSyncLocked("write", UPDATE_ALL);
        scheduleSyncLocked("write", UPDATE_ALL);
        // Since we use a single threaded executor, we can assume the next scheduled task's
        // Since we use a single threaded executor, we can assume the next scheduled task's
        // Future finishes after the sync.
        // Future finishes after the sync.
@@ -127,14 +132,20 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
     * within the task, never wait on the resulting Future. This will result in a deadlock.
     * within the task, never wait on the resulting Future. This will result in a deadlock.
     */
     */
    public synchronized void scheduleRunnable(Runnable runnable) {
    public synchronized void scheduleRunnable(Runnable runnable) {
        if (!mExecutorService.isShutdown()) {
            mExecutorService.submit(runnable);
            mExecutorService.submit(runnable);
        }
        }
    }


    public void shutdown() {
    public void shutdown() {
        mExecutorService.shutdownNow();
        mExecutorService.shutdownNow();
    }
    }


    private Future<?> scheduleSyncLocked(String reason, int flags) {
    private Future<?> scheduleSyncLocked(String reason, int flags) {
        if (mExecutorService.isShutdown()) {
            return CompletableFuture.failedFuture(new IllegalStateException("worker shutdown"));
        }

        if (mCurrentFuture == null) {
        if (mCurrentFuture == null) {
            mUpdateFlags = flags;
            mUpdateFlags = flags;
            mCurrentReason = reason;
            mCurrentReason = reason;