Merge "Fix race condition when collecting op callback."

This commit is contained in:
Jeff Sharkey
2015-12-03 16:58:34 +00:00
committed by Gerrit Code Review

View File

@@ -513,33 +513,35 @@ public class AppOpsService extends IAppOpsService.Stub {
String[] uidPackageNames = getPackagesForUid(uid); String[] uidPackageNames = getPackagesForUid(uid);
ArrayMap<Callback, ArraySet<String>> callbackSpecs = null; ArrayMap<Callback, ArraySet<String>> callbackSpecs = null;
ArrayList<Callback> callbacks = mOpModeWatchers.get(code); synchronized (this) {
if (callbacks != null) { ArrayList<Callback> callbacks = mOpModeWatchers.get(code);
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
Callback callback = callbacks.get(i);
ArraySet<String> changedPackages = new ArraySet<>();
Collections.addAll(changedPackages, uidPackageNames);
callbackSpecs = new ArrayMap<>();
callbackSpecs.put(callback, changedPackages);
}
}
for (String uidPackageName : uidPackageNames) {
callbacks = mPackageModeWatchers.get(uidPackageName);
if (callbacks != null) { if (callbacks != null) {
if (callbackSpecs == null) {
callbackSpecs = new ArrayMap<>();
}
final int callbackCount = callbacks.size(); final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) { for (int i = 0; i < callbackCount; i++) {
Callback callback = callbacks.get(i); Callback callback = callbacks.get(i);
ArraySet<String> changedPackages = callbackSpecs.get(callback); ArraySet<String> changedPackages = new ArraySet<>();
if (changedPackages == null) { Collections.addAll(changedPackages, uidPackageNames);
changedPackages = new ArraySet<>(); callbackSpecs = new ArrayMap<>();
callbackSpecs.put(callback, changedPackages); callbackSpecs.put(callback, changedPackages);
}
}
for (String uidPackageName : uidPackageNames) {
callbacks = mPackageModeWatchers.get(uidPackageName);
if (callbacks != null) {
if (callbackSpecs == null) {
callbackSpecs = new ArrayMap<>();
}
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
Callback callback = callbacks.get(i);
ArraySet<String> changedPackages = callbackSpecs.get(callback);
if (changedPackages == null) {
changedPackages = new ArraySet<>();
callbackSpecs.put(callback, changedPackages);
}
changedPackages.add(uidPackageName);
} }
changedPackages.add(uidPackageName);
} }
} }
} }
@@ -1773,7 +1775,7 @@ public class AppOpsService extends IAppOpsService.Stub {
private static String[] getPackagesForUid(int uid) { private static String[] getPackagesForUid(int uid) {
String[] packageNames = null; String[] packageNames = null;
try { try {
packageNames= AppGlobals.getPackageManager().getPackagesForUid(uid); packageNames = AppGlobals.getPackageManager().getPackagesForUid(uid);
} catch (RemoteException e) { } catch (RemoteException e) {
/* ignore - local call */ /* ignore - local call */
} }