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

Commit 26f89e2f authored by JW Wang's avatar JW Wang
Browse files

Rewrite expireRollbackForPackage (3/n)

Split the method into 2 parts to uphold thread invariants.

Note since the original expireRollbackForPackage do the expiration
synchronously, we have to block the caller thread until the task is done
on the handler thread.

This dispatch-and-wait pattern will be used in the following CLs.

Bug: 145335013
Test: atest CtsRollbackManagerHostTestCases
Test: atest RollbackTest
Test: atest StagedRollbackTest
Change-Id: Icf39d70c4f9af77b41598d341063e35bb5c900ac
parent 7846a952
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -83,7 +83,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -299,6 +301,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        registerTimeChangeReceiver();
    }

    private void awaitResult(Runnable runnable) {
        assertNotInWorkerThread();
        try {
            CompletableFuture.runAsync(runnable, mExecutor).get();
        } catch (InterruptedException | ExecutionException e) {
            throw new RuntimeException(e);
        }
    }

    private void assertInWorkerThread() {
        Preconditions.checkState(mHandlerThread.getLooper().isCurrentThread());
    }
@@ -475,11 +486,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        }
    }

    @Override
    public void expireRollbackForPackage(String packageName) {
        mContext.enforceCallingOrSelfPermission(
                Manifest.permission.TEST_MANAGE_ROLLBACKS,
                "expireRollbackForPackage");
    @WorkerThread
    private void expireRollbackForPackageInternal(String packageName) {
        assertInWorkerThread();
        synchronized (mLock) {
            Iterator<Rollback> iter = mRollbacks.iterator();
            while (iter.hasNext()) {
@@ -492,6 +501,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        }
    }

    @ExtThread
    @Override
    public void expireRollbackForPackage(String packageName) {
        assertNotInWorkerThread();
        mContext.enforceCallingOrSelfPermission(
                Manifest.permission.TEST_MANAGE_ROLLBACKS,
                "expireRollbackForPackage");
        awaitResult(() -> expireRollbackForPackageInternal(packageName));
    }

    @ExtThread
    @Override
    public void blockRollbackManager(long millis) {
@@ -670,7 +689,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
    @WorkerThread
    private void onPackageFullyRemoved(String packageName) {
        assertInWorkerThread();
        expireRollbackForPackage(packageName);
        expireRollbackForPackageInternal(packageName);
    }

    /**