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
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 831c298..af56cb4 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -272,17 +272,10 @@
@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 @@
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 @@
*/
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 @@
@Override
public void setTheme(int resId) {
- synchronized (mThemeLock) {
+ synchronized (mSync) {
if (mThemeResource != resId) {
mThemeResource = resId;
initializeTheme();
@@ -471,14 +468,14 @@
@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 @@
}
}
- @GuardedBy("mThemeLock")
private void initializeTheme() {
if (mTheme == null) {
mTheme = mResources.newTheme();
@@ -735,18 +731,12 @@
@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 @@
/**
* 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 @@
}
}
}
+ 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 @@
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 @@
@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 @@
@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 @@
@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 @@
}
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