diff options
| -rw-r--r-- | core/java/android/os/StrictMode.java | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 94f90ccb2d9d..f13e89e97823 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -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; |