summaryrefslogtreecommitdiff
path: root/services/print
diff options
context:
space:
mode:
authorKoji Fukui <koji.fukui@sony.com>2017-10-20 16:42:51 +0900
committerKoji Fukui <Koji.Fukui@sony.com>2017-11-13 08:27:21 +0000
commit05b6857f6b4b4ce7c0e4df38d38264bf42297d3b (patch)
treee7b9e620dab25164d7bd46676f67a395d484a833 /services/print
parent80c3c7093040a6c66a2fa7c634451694d2bb5ee8 (diff)
Stop observing death of PrintManager listener when it is removed
Symptom: Global reference table overflow happens on system_server. Root cause: When a listener is added to the PrintManager, death notification for the listener is registered. So the listener is added to global reference table. But the death notification is not unregistered when the listener is removed from PrintManager. The listener isn't removed from the global reference table until client process die. If client process repeatedly add/remove listener, the global reference table overflow. Solution: Call unlinkToDeath() when the listener is removed from PrintManager. Test: cts-tradefed run cts-dev -m Print Bug: 68746445 Change-Id: I0b133e4607317a15e51bdf6e1248552dcc920d6d
Diffstat (limited to 'services/print')
-rw-r--r--services/print/java/com/android/server/print/UserState.java11
1 files changed, 11 insertions, 0 deletions
diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java
index 5770c5079d94..fcc6f525ef14 100644
--- a/services/print/java/com/android/server/print/UserState.java
+++ b/services/print/java/com/android/server/print/UserState.java
@@ -586,6 +586,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
PrintJobStateChangeListenerRecord record =
mPrintJobStateChangeListenerRecords.get(i);
if (record.listener.asBinder().equals(listener.asBinder())) {
+ record.destroy();
mPrintJobStateChangeListenerRecords.remove(i);
break;
}
@@ -628,6 +629,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
ListenerRecord<IPrintServicesChangeListener> record =
mPrintServicesChangeListenerRecords.get(i);
if (record.listener.asBinder().equals(listener.asBinder())) {
+ record.destroy();
mPrintServicesChangeListenerRecords.remove(i);
break;
}
@@ -675,6 +677,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
ListenerRecord<IRecommendationsChangeListener> record =
mPrintServiceRecommendationsChangeListenerRecords.get(i);
if (record.listener.asBinder().equals(listener.asBinder())) {
+ record.destroy();
mPrintServiceRecommendationsChangeListenerRecords.remove(i);
break;
}
@@ -1222,6 +1225,10 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
listener.asBinder().linkToDeath(this, 0);
}
+ public void destroy() {
+ listener.asBinder().unlinkToDeath(this, 0);
+ }
+
@Override
public void binderDied() {
listener.asBinder().unlinkToDeath(this, 0);
@@ -1239,6 +1246,10 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
listener.asBinder().linkToDeath(this, 0);
}
+ public void destroy() {
+ listener.asBinder().unlinkToDeath(this, 0);
+ }
+
@Override
public void binderDied() {
listener.asBinder().unlinkToDeath(this, 0);