Fix NPE due to missing ProcessItem.mPackageInfo

The reason was that a item was removed from the SparseArray while
iterating it causing one ProcessItem to be skipped in the loop which
makes sure that mPackageInfo is not null. This happens when all
processes for one uid is stopped and a new process is created.
This problem was found by running monkey.

Change-Id: I5e9a76e8007819d5e6d9ba15af0c2362da193526
This commit is contained in:
Johannes Carlsson
2010-12-20 13:42:54 +01:00
committed by Johan Redestig
parent 643e48b7fd
commit 8258dc23d3

View File

@@ -756,6 +756,7 @@ public class RunningState {
} }
// Look for services and their primary processes that no longer exist... // Look for services and their primary processes that no longer exist...
ArrayList<Integer> uidToDelete = null;
for (int i=0; i<mServiceProcessesByName.size(); i++) { for (int i=0; i<mServiceProcessesByName.size(); i++) {
HashMap<String, ProcessItem> procs = mServiceProcessesByName.valueAt(i); HashMap<String, ProcessItem> procs = mServiceProcessesByName.valueAt(i);
Iterator<ProcessItem> pit = procs.values().iterator(); Iterator<ProcessItem> pit = procs.values().iterator();
@@ -772,7 +773,10 @@ public class RunningState {
changed = true; changed = true;
pit.remove(); pit.remove();
if (procs.size() == 0) { if (procs.size() == 0) {
mServiceProcessesByName.remove(mServiceProcessesByName.keyAt(i)); if (uidToDelete == null) {
uidToDelete = new ArrayList<Integer>();
}
uidToDelete.add(mServiceProcessesByName.keyAt(i));
} }
if (pi.mPid != 0) { if (pi.mPid != 0) {
mServiceProcessesByPid.remove(pi.mPid); mServiceProcessesByPid.remove(pi.mPid);
@@ -790,6 +794,13 @@ public class RunningState {
} }
} }
if (uidToDelete != null) {
for (int i = 0; i < uidToDelete.size(); i++) {
int uid = uidToDelete.get(i);
mServiceProcessesByName.remove(uid);
}
}
if (changed) { if (changed) {
// First determine an order for the services. // First determine an order for the services.
ArrayList<ProcessItem> sortedProcesses = new ArrayList<ProcessItem>(); ArrayList<ProcessItem> sortedProcesses = new ArrayList<ProcessItem>();