diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-11-14 15:44:36 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-11-14 15:44:36 -0800 |
commit | 8e9b5fc93278084487fd98726c6e20333d675c40 (patch) | |
tree | d1d7059dcbd2b6bc31d9d000f3ba50e6097af9f7 /services/java/com | |
parent | 0dcddb447c97d5220d21315de428079dada9bdcb (diff) | |
parent | 59bf3be7d1cd7311cf60ead6872f33433a097bd1 (diff) | |
download | frameworks_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.java | 21 |
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 |