am e1a6299b: Relax locking when scanning private volumes.

* commit 'e1a6299b994bbdb304550e00d5b3b26a064bdf0c':
  Relax locking when scanning private volumes.
This commit is contained in:
Jeff Sharkey
2015-09-21 20:29:58 +00:00
committed by Android Git Automerger

View File

@@ -15678,14 +15678,28 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
private void loadPrivatePackages(VolumeInfo vol) {
private void loadPrivatePackages(final VolumeInfo vol) {
mHandler.post(new Runnable() {
@Override
public void run() {
loadPrivatePackagesInner(vol);
}
});
}
private void loadPrivatePackagesInner(VolumeInfo vol) {
final ArrayList<ApplicationInfo> loaded = new ArrayList<>();
final int parseFlags = mDefParseFlags | PackageParser.PARSE_EXTERNAL_STORAGE;
synchronized (mInstallLock) {
final VersionInfo ver;
final List<PackageSetting> packages;
synchronized (mPackages) {
final VersionInfo ver = mSettings.findOrCreateVersion(vol.fsUuid);
final List<PackageSetting> packages = mSettings.getVolumePackagesLPr(vol.fsUuid);
for (PackageSetting ps : packages) {
ver = mSettings.findOrCreateVersion(vol.fsUuid);
packages = mSettings.getVolumePackagesLPr(vol.fsUuid);
}
for (PackageSetting ps : packages) {
synchronized (mInstallLock) {
final PackageParser.Package pkg;
try {
pkg = scanPackageLI(ps.codePath, parseFlags, SCAN_INITIAL, 0L, null);
@@ -15698,7 +15712,9 @@ public class PackageManagerService extends IPackageManager.Stub {
deleteCodeCacheDirsLI(ps.volumeUuid, ps.name);
}
}
}
synchronized (mPackages) {
int updateFlags = UPDATE_PERMISSIONS_ALL;
if (ver.sdkVersion != mSdkVersion) {
logCriticalInfo(Log.INFO, "Platform changed from " + ver.sdkVersion + " to "
@@ -15712,13 +15728,21 @@ public class PackageManagerService extends IPackageManager.Stub {
mSettings.writeLPr();
}
}
if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded);
sendResourcesChangedBroadcast(true, false, loaded, null);
}
private void unloadPrivatePackages(VolumeInfo vol) {
private void unloadPrivatePackages(final VolumeInfo vol) {
mHandler.post(new Runnable() {
@Override
public void run() {
unloadPrivatePackagesInner(vol);
}
});
}
private void unloadPrivatePackagesInner(VolumeInfo vol) {
final ArrayList<ApplicationInfo> unloaded = new ArrayList<>();
synchronized (mInstallLock) {
synchronized (mPackages) {