summaryrefslogtreecommitdiffstats
path: root/services/java/com
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2013-11-14 15:44:36 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2013-11-14 15:44:36 -0800
commit8e9b5fc93278084487fd98726c6e20333d675c40 (patch)
treed1d7059dcbd2b6bc31d9d000f3ba50e6097af9f7 /services/java/com
parent0dcddb447c97d5220d21315de428079dada9bdcb (diff)
parent59bf3be7d1cd7311cf60ead6872f33433a097bd1 (diff)
downloadframeworks_base-8e9b5fc93278084487fd98726c6e20333d675c40.zip
frameworks_base-8e9b5fc93278084487fd98726c6e20333d675c40.tar.gz
frameworks_base-8e9b5fc93278084487fd98726c6e20333d675c40.tar.bz2
am 59bf3be7: am 2e3ede74: Merge "Maybe fix issue #11634365: Leaking restarting services" into klp-dev
* commit '59bf3be7d1cd7311cf60ead6872f33433a097bd1': Maybe fix issue #11634365: Leaking restarting services
Diffstat (limited to 'services/java/com')
-rw-r--r--services/java/com/android/server/am/ActiveServices.java21
1 files changed, 20 insertions, 1 deletions
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java
index a80afbc..933247e 100644
--- a/services/java/com/android/server/am/ActiveServices.java
+++ b/services/java/com/android/server/am/ActiveServices.java
@@ -1847,6 +1847,9 @@ public final class ActiveServices {
}
}
if (finishing) {
+ if (r.app != null) {
+ r.app.services.remove(r);
+ }
r.app = null;
}
}
@@ -1927,6 +1930,7 @@ public final class ActiveServices {
Slog.i(TAG, " Force stopping service " + service);
if (service.app != null) {
service.app.removed = true;
+ service.app.services.remove(service);
}
service.app = null;
service.isolatedProc = null;
@@ -2028,6 +2032,9 @@ public final class ActiveServices {
synchronized (sr.stats.getBatteryStats()) {
sr.stats.stopLaunchedLocked();
}
+ if (sr.app != null) {
+ sr.app.services.remove(sr);
+ }
sr.app = null;
sr.isolatedProc = null;
sr.executeNesting = 0;
@@ -2053,11 +2060,23 @@ public final class ActiveServices {
}
app.connections.clear();
+ ServiceMap smap = getServiceMap(app.userId);
+
// Now do remaining service cleanup.
for (int i=app.services.size()-1; i>=0; i--) {
+ ServiceRecord sr = app.services.valueAt(i);
+ // Sanity check: if the service listed for the app is not one
+ // we actually are maintaining, drop it.
+ if (smap.mServicesByName.get(sr.name) != sr) {
+ ServiceRecord cur = smap.mServicesByName.get(sr.name);
+ Slog.wtf(TAG, "Service " + sr + " in process " + app
+ + " not same as in map: " + cur);
+ app.services.removeAt(i);
+ continue;
+ }
+
// Any services running in the application may need to be placed
// back in the pending list.
- ServiceRecord sr = app.services.valueAt(i);
if (allowRestart && sr.crashCount >= 2 && (sr.serviceInfo.applicationInfo.flags
&ApplicationInfo.FLAG_PERSISTENT) == 0) {
Slog.w(TAG, "Service crashed " + sr.crashCount