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

Commit b6f3f884 authored by Jared Duke's avatar Jared Duke
Browse files

Cache StrictMode handle to IStorageManager

Certain StrictMode paths can result in repeated and frequent queries
to IStorageManager.isCeStorageUnlocked. Avoid associated overhead by
caching the IStorageManager handle when necessary.

Note that StorageManager.isCeStorageUnlocked has similar handle caching
behavior. We could simply reuse that method, however, it has slightly
different semantics when the query fails (for StrictMode, we simply
ignore those failures).

Bug: 318403642
Test: presubmit
Change-Id: Ibe52808b314e8f8044d423761d99df680ce2c8e4
parent 2619e670
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -2373,13 +2373,29 @@ public final class StrictMode {
    /** Assume locked until we hear otherwise */
    private static volatile boolean sCeStorageUnlocked = false;

    /**
     * Avoid (potentially) costly and repeated lookups to the same mount service.
     * Note that we don't use the Singleton wrapper as lookup may fail early during boot.
     */
    private static volatile IStorageManager sStorageManager;

    private static boolean isCeStorageUnlocked(int userId) {
        final IStorageManager storage = IStorageManager.Stub
        IStorageManager storage = sStorageManager;
        if (storage == null) {
            storage = IStorageManager.Stub
                .asInterface(ServiceManager.getService("mount"));
            // As the queried handle may be null early during boot, only stash valid handles,
            // avoiding races with concurrent service queries.
            if (storage != null) {
                sStorageManager = storage;
            }
        }
        if (storage != null) {
            try {
                return storage.isCeStorageUnlocked(userId);
            } catch (RemoteException ignored) {
                // Conservatively clear the ref, allowing refresh if the remote process restarts.
                sStorageManager = null;
            }
        }
        return false;