Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05b6857f authored by Koji Fukui's avatar Koji Fukui Committed by Koji Fukui
Browse files

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
parent 80c3c709
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -586,6 +586,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
                PrintJobStateChangeListenerRecord record =
                PrintJobStateChangeListenerRecord record =
                        mPrintJobStateChangeListenerRecords.get(i);
                        mPrintJobStateChangeListenerRecords.get(i);
                if (record.listener.asBinder().equals(listener.asBinder())) {
                if (record.listener.asBinder().equals(listener.asBinder())) {
                    record.destroy();
                    mPrintJobStateChangeListenerRecords.remove(i);
                    mPrintJobStateChangeListenerRecords.remove(i);
                    break;
                    break;
                }
                }
@@ -628,6 +629,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
                ListenerRecord<IPrintServicesChangeListener> record =
                ListenerRecord<IPrintServicesChangeListener> record =
                        mPrintServicesChangeListenerRecords.get(i);
                        mPrintServicesChangeListenerRecords.get(i);
                if (record.listener.asBinder().equals(listener.asBinder())) {
                if (record.listener.asBinder().equals(listener.asBinder())) {
                    record.destroy();
                    mPrintServicesChangeListenerRecords.remove(i);
                    mPrintServicesChangeListenerRecords.remove(i);
                    break;
                    break;
                }
                }
@@ -675,6 +677,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
                ListenerRecord<IRecommendationsChangeListener> record =
                ListenerRecord<IRecommendationsChangeListener> record =
                        mPrintServiceRecommendationsChangeListenerRecords.get(i);
                        mPrintServiceRecommendationsChangeListenerRecords.get(i);
                if (record.listener.asBinder().equals(listener.asBinder())) {
                if (record.listener.asBinder().equals(listener.asBinder())) {
                    record.destroy();
                    mPrintServiceRecommendationsChangeListenerRecords.remove(i);
                    mPrintServiceRecommendationsChangeListenerRecords.remove(i);
                    break;
                    break;
                }
                }
@@ -1222,6 +1225,10 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
            listener.asBinder().linkToDeath(this, 0);
            listener.asBinder().linkToDeath(this, 0);
        }
        }


        public void destroy() {
            listener.asBinder().unlinkToDeath(this, 0);
        }

        @Override
        @Override
        public void binderDied() {
        public void binderDied() {
            listener.asBinder().unlinkToDeath(this, 0);
            listener.asBinder().unlinkToDeath(this, 0);
@@ -1239,6 +1246,10 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
            listener.asBinder().linkToDeath(this, 0);
            listener.asBinder().linkToDeath(this, 0);
        }
        }


        public void destroy() {
            listener.asBinder().unlinkToDeath(this, 0);
        }

        @Override
        @Override
        public void binderDied() {
        public void binderDied() {
            listener.asBinder().unlinkToDeath(this, 0);
            listener.asBinder().unlinkToDeath(this, 0);