diff options
author | 2024-03-13 16:50:40 +0000 | |
---|---|---|
committer | 2024-03-13 16:50:40 +0000 | |
commit | 8beb72024991cc2af43b13f50c8aeabc7d4f39dc (patch) | |
tree | 8ae3ad0cc9fad4fc1add2f73854d8ad92b15f75e | |
parent | 8da0f1e25c3a5703f908a82a51a3e2f8021c08b6 (diff) |
Revert "Reduce lock contention in ContextImpl"
This reverts commit 8da0f1e25c3a5703f908a82a51a3e2f8021c08b6.
Reason for revert: Based on local testing, this is responsible for b/329240768
Change-Id: I58910653bea4a024f2e5d1feaf47f93b8b9df534
-rw-r--r-- | core/java/android/app/ContextImpl.java | 231 |
1 files changed, 75 insertions, 156 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 831c2987e74a..af56cb4d55b2 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -272,17 +272,10 @@ class ContextImpl extends Context { @UnsupportedAppUsage private Context mOuterContext; - - private final Object mThemeLock = new Object(); - @UnsupportedAppUsage - @GuardedBy("mThemeLock") private int mThemeResource = 0; - @UnsupportedAppUsage - @GuardedBy("mThemeLock") private Resources.Theme mTheme = null; - @UnsupportedAppUsage private PackageManager mPackageManager; private Context mReceiverRestrictedContext = null; @@ -295,6 +288,7 @@ class ContextImpl extends Context { private ContentCaptureOptions mContentCaptureOptions = null; + private final Object mSync = new Object(); /** * Indicates this {@link Context} can not handle UI components properly and is not associated * with a {@link Display} instance. @@ -346,18 +340,21 @@ class ContextImpl extends Context { */ private boolean mOwnsToken = false; - private final Object mDirsLock = new Object(); - private volatile File mDatabasesDir; - @UnsupportedAppUsage private volatile File mPreferencesDir; - private volatile File mFilesDir; - private volatile File mCratesDir; - private volatile File mNoBackupFilesDir; - private volatile File[] mExternalFilesDirs; - private volatile File[] mObbDirs; - private volatile File mCacheDir; - private volatile File mCodeCacheDir; - private volatile File[] mExternalCacheDirs; - private volatile File[] mExternalMediaDirs; + @GuardedBy("mSync") + private File mDatabasesDir; + @GuardedBy("mSync") + @UnsupportedAppUsage + private File mPreferencesDir; + @GuardedBy("mSync") + private File mFilesDir; + @GuardedBy("mSync") + private File mCratesDir; + @GuardedBy("mSync") + private File mNoBackupFilesDir; + @GuardedBy("mSync") + private File mCacheDir; + @GuardedBy("mSync") + private File mCodeCacheDir; // The system service cache for the system services that are cached per-ContextImpl. @UnsupportedAppUsage @@ -461,7 +458,7 @@ class ContextImpl extends Context { @Override public void setTheme(int resId) { - synchronized (mThemeLock) { + synchronized (mSync) { if (mThemeResource != resId) { mThemeResource = resId; initializeTheme(); @@ -471,14 +468,14 @@ class ContextImpl extends Context { @Override public int getThemeResId() { - synchronized (mThemeLock) { + synchronized (mSync) { return mThemeResource; } } @Override public Resources.Theme getTheme() { - synchronized (mThemeLock) { + synchronized (mSync) { if (mTheme != null) { return mTheme; } @@ -491,7 +488,6 @@ class ContextImpl extends Context { } } - @GuardedBy("mThemeLock") private void initializeTheme() { if (mTheme == null) { mTheme = mResources.newTheme(); @@ -735,18 +731,12 @@ class ContextImpl extends Context { @UnsupportedAppUsage private File getPreferencesDir() { - File localPreferencesDir = mPreferencesDir; - if (localPreferencesDir == null) { - synchronized (mDirsLock) { - localPreferencesDir = mPreferencesDir; - if (localPreferencesDir == null) { - localPreferencesDir = new File(getDataDir(), "shared_prefs"); - ensurePrivateDirExists(localPreferencesDir); - mPreferencesDir = localPreferencesDir; - } + synchronized (mSync) { + if (mPreferencesDir == null) { + mPreferencesDir = new File(getDataDir(), "shared_prefs"); } + return ensurePrivateDirExists(mPreferencesDir); } - return localPreferencesDir; } @Override @@ -788,16 +778,16 @@ class ContextImpl extends Context { /** * Common-path handling of app data dir creation */ - private static void ensurePrivateDirExists(File file) { - ensurePrivateDirExists(file, 0771, -1, null); + private static File ensurePrivateDirExists(File file) { + return ensurePrivateDirExists(file, 0771, -1, null); } - private static void ensurePrivateCacheDirExists(File file, String xattr) { + private static File ensurePrivateCacheDirExists(File file, String xattr) { final int gid = UserHandle.getCacheAppGid(Process.myUid()); - ensurePrivateDirExists(file, 02771, gid, xattr); + return ensurePrivateDirExists(file, 02771, gid, xattr); } - private static void ensurePrivateDirExists(File file, int mode, int gid, String xattr) { + private static File ensurePrivateDirExists(File file, int mode, int gid, String xattr) { if (!file.exists()) { final String path = file.getAbsolutePath(); try { @@ -825,22 +815,17 @@ class ContextImpl extends Context { } } } + return file; } @Override public File getFilesDir() { - File localFilesDir = mFilesDir; - if (localFilesDir == null) { - localFilesDir = mFilesDir; - synchronized (mDirsLock) { - if (localFilesDir == null) { - localFilesDir = new File(getDataDir(), "files"); - ensurePrivateDirExists(localFilesDir); - mFilesDir = localFilesDir; - } + synchronized (mSync) { + if (mFilesDir == null) { + mFilesDir = new File(getDataDir(), "files"); } + return ensurePrivateDirExists(mFilesDir); } - return localFilesDir; } @Override @@ -850,37 +835,25 @@ class ContextImpl extends Context { final Path absoluteNormalizedCratePath = cratesRootPath.resolve(crateId) .toAbsolutePath().normalize(); - File localCratesDir = mCratesDir; - if (localCratesDir == null) { - synchronized (mDirsLock) { - localCratesDir = mCratesDir; - if (localCratesDir == null) { - localCratesDir = cratesRootPath.toFile(); - ensurePrivateDirExists(localCratesDir); - mCratesDir = localCratesDir; - } + synchronized (mSync) { + if (mCratesDir == null) { + mCratesDir = cratesRootPath.toFile(); } + ensurePrivateDirExists(mCratesDir); } - File crateDir = absoluteNormalizedCratePath.toFile(); - ensurePrivateDirExists(crateDir); - return crateDir; + File cratedDir = absoluteNormalizedCratePath.toFile(); + return ensurePrivateDirExists(cratedDir); } @Override public File getNoBackupFilesDir() { - File localNoBackupFilesDir = mNoBackupFilesDir; - if (localNoBackupFilesDir == null) { - synchronized (mDirsLock) { - localNoBackupFilesDir = mNoBackupFilesDir; - if (localNoBackupFilesDir == null) { - localNoBackupFilesDir = new File(getDataDir(), "no_backup"); - ensurePrivateDirExists(localNoBackupFilesDir); - mNoBackupFilesDir = localNoBackupFilesDir; - } + synchronized (mSync) { + if (mNoBackupFilesDir == null) { + mNoBackupFilesDir = new File(getDataDir(), "no_backup"); } + return ensurePrivateDirExists(mNoBackupFilesDir); } - return localNoBackupFilesDir; } @Override @@ -892,24 +865,13 @@ class ContextImpl extends Context { @Override public File[] getExternalFilesDirs(String type) { - File[] localExternalFilesDirs = mExternalFilesDirs; - if (localExternalFilesDirs == null) { - synchronized (mDirsLock) { - localExternalFilesDirs = mExternalFilesDirs; - if (localExternalFilesDirs == null) { - localExternalFilesDirs = - Environment.buildExternalStorageAppFilesDirs(getPackageName()); - if (type != null) { - localExternalFilesDirs = - Environment.buildPaths(localExternalFilesDirs, type); - } - localExternalFilesDirs = ensureExternalDirsExistOrFilter( - localExternalFilesDirs, true /* tryCreateInProcess */); - mExternalFilesDirs = localExternalFilesDirs; - } + synchronized (mSync) { + File[] dirs = Environment.buildExternalStorageAppFilesDirs(getPackageName()); + if (type != null) { + dirs = Environment.buildPaths(dirs, type); } + return ensureExternalDirsExistOrFilter(dirs, true /* tryCreateInProcess */); } - return localExternalFilesDirs; } @Override @@ -921,51 +883,30 @@ class ContextImpl extends Context { @Override public File[] getObbDirs() { - File[] localObbDirs = mObbDirs; - if (mObbDirs == null) { - synchronized (mDirsLock) { - localObbDirs = mObbDirs; - if (localObbDirs == null) { - localObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName()); - localObbDirs = ensureExternalDirsExistOrFilter( - localObbDirs, true /* tryCreateInProcess */); - mObbDirs = localObbDirs; - } - } + synchronized (mSync) { + File[] dirs = Environment.buildExternalStorageAppObbDirs(getPackageName()); + return ensureExternalDirsExistOrFilter(dirs, true /* tryCreateInProcess */); } - return localObbDirs; } @Override public File getCacheDir() { - File localCacheDir = mCacheDir; - if (localCacheDir == null) { - synchronized (mDirsLock) { - localCacheDir = mCacheDir; - if (localCacheDir == null) { - localCacheDir = new File(getDataDir(), "cache"); - ensurePrivateCacheDirExists(localCacheDir, XATTR_INODE_CACHE); - mCacheDir = localCacheDir; - } + synchronized (mSync) { + if (mCacheDir == null) { + mCacheDir = new File(getDataDir(), "cache"); } + return ensurePrivateCacheDirExists(mCacheDir, XATTR_INODE_CACHE); } - return localCacheDir; } @Override public File getCodeCacheDir() { - File localCodeCacheDir = mCodeCacheDir; - if (localCodeCacheDir == null) { - synchronized (mDirsLock) { - localCodeCacheDir = mCodeCacheDir; - if (localCodeCacheDir == null) { - localCodeCacheDir = getCodeCacheDirBeforeBind(getDataDir()); - ensurePrivateCacheDirExists(localCodeCacheDir, XATTR_INODE_CODE_CACHE); - mCodeCacheDir = localCodeCacheDir; - } + synchronized (mSync) { + if (mCodeCacheDir == null) { + mCodeCacheDir = getCodeCacheDirBeforeBind(getDataDir()); } + return ensurePrivateCacheDirExists(mCodeCacheDir, XATTR_INODE_CODE_CACHE); } - return localCodeCacheDir; } /** @@ -986,37 +927,21 @@ class ContextImpl extends Context { @Override public File[] getExternalCacheDirs() { - File[] localExternalCacheDirs = mExternalCacheDirs; - if (localExternalCacheDirs == null) { - synchronized (mDirsLock) { - localExternalCacheDirs = mExternalCacheDirs; - if (localExternalCacheDirs == null) { - localExternalCacheDirs = - Environment.buildExternalStorageAppCacheDirs(getPackageName()); - localExternalCacheDirs = ensureExternalDirsExistOrFilter( - localExternalCacheDirs, false /* tryCreateInProcess */); - mExternalCacheDirs = localExternalCacheDirs; - } - } + synchronized (mSync) { + File[] dirs = Environment.buildExternalStorageAppCacheDirs(getPackageName()); + // We don't try to create cache directories in-process, because they need special + // setup for accurate quota tracking. This ensures the cache dirs are always + // created through StorageManagerService. + return ensureExternalDirsExistOrFilter(dirs, false /* tryCreateInProcess */); } - return localExternalCacheDirs; } @Override public File[] getExternalMediaDirs() { - File[] localExternalMediaDirs = mExternalMediaDirs; - if (localExternalMediaDirs == null) { - synchronized (mDirsLock) { - localExternalMediaDirs = mExternalMediaDirs; - if (localExternalMediaDirs == null) { - localExternalMediaDirs = Environment.buildExternalStorageAppMediaDirs(getPackageName()); - localExternalMediaDirs = ensureExternalDirsExistOrFilter( - localExternalMediaDirs, true /* tryCreateInProcess */); - mExternalMediaDirs = localExternalMediaDirs; - } - } + synchronized (mSync) { + File[] dirs = Environment.buildExternalStorageAppMediaDirs(getPackageName()); + return ensureExternalDirsExistOrFilter(dirs, true /* tryCreateInProcess */); } - return localExternalMediaDirs; } /** @@ -1115,22 +1040,16 @@ class ContextImpl extends Context { } private File getDatabasesDir() { - File localDatabasesDir = mDatabasesDir; - if (localDatabasesDir == null) { - synchronized (mDirsLock) { - localDatabasesDir = mDatabasesDir; - if (localDatabasesDir == null) { - if ("android".equals(getPackageName())) { - localDatabasesDir = new File("/data/system"); - } else { - localDatabasesDir = new File(getDataDir(), "databases"); - } - ensurePrivateDirExists(localDatabasesDir); - mDatabasesDir = localDatabasesDir; + synchronized (mSync) { + if (mDatabasesDir == null) { + if ("android".equals(getPackageName())) { + mDatabasesDir = new File("/data/system"); + } else { + mDatabasesDir = new File(getDataDir(), "databases"); } } + return ensurePrivateDirExists(mDatabasesDir); } - return localDatabasesDir; } @Override |