summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Burk <philburk@google.com>2016-04-18 16:05:28 -0700
committerPhil Burk <philburk@google.com>2016-04-18 16:45:22 -0700
commit042e67a90ae18196e9a1126adfdf0f1b8c6a4333 (patch)
treeb1ca52960f0d5914e8a5ad7c853702491de20f57
parentb2e4e98e7c2b54966b48945a0418187564d71085 (diff)
MidiService: fix resource leak
The proxy object was being used to match when adding or removing objects. But they are different each time. So now we use an asBinder() object. Bug: 28153736 Change-Id: I1bccebf1e9464668db757ff08b41902d0cf0e3a7 Signed-off-by: Phil Burk <philburk@google.com>
-rw-r--r--services/midi/java/com/android/server/midi/MidiService.java16
1 files changed, 9 insertions, 7 deletions
diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java
index c6d5a7e268b7..723be2481d6f 100644
--- a/services/midi/java/com/android/server/midi/MidiService.java
+++ b/services/midi/java/com/android/server/midi/MidiService.java
@@ -126,8 +126,8 @@ public class MidiService extends IMidiManager.Stub {
// This client's PID
private final int mPid;
// List of all receivers for this client
- private final ArrayList<IMidiDeviceListener> mListeners
- = new ArrayList<IMidiDeviceListener>();
+ private final HashMap<IBinder, IMidiDeviceListener> mListeners
+ = new HashMap<IBinder, IMidiDeviceListener>();
// List of all device connections for this client
private final HashMap<IBinder, DeviceConnection> mDeviceConnections
= new HashMap<IBinder, DeviceConnection>();
@@ -143,11 +143,13 @@ public class MidiService extends IMidiManager.Stub {
}
public void addListener(IMidiDeviceListener listener) {
- mListeners.add(listener);
+ // Use asBinder() so that we can match it in removeListener().
+ // The listener proxy objects themselves do not match.
+ mListeners.put(listener.asBinder(), listener);
}
public void removeListener(IMidiDeviceListener listener) {
- mListeners.remove(listener);
+ mListeners.remove(listener.asBinder());
if (mListeners.size() == 0 && mDeviceConnections.size() == 0) {
close();
}
@@ -184,7 +186,7 @@ public class MidiService extends IMidiManager.Stub {
MidiDeviceInfo deviceInfo = device.getDeviceInfo();
try {
- for (IMidiDeviceListener listener : mListeners) {
+ for (IMidiDeviceListener listener : mListeners.values()) {
listener.onDeviceAdded(deviceInfo);
}
} catch (RemoteException e) {
@@ -198,7 +200,7 @@ public class MidiService extends IMidiManager.Stub {
MidiDeviceInfo deviceInfo = device.getDeviceInfo();
try {
- for (IMidiDeviceListener listener : mListeners) {
+ for (IMidiDeviceListener listener : mListeners.values()) {
listener.onDeviceRemoved(deviceInfo);
}
} catch (RemoteException e) {
@@ -211,7 +213,7 @@ public class MidiService extends IMidiManager.Stub {
if (!device.isUidAllowed(mUid)) return;
try {
- for (IMidiDeviceListener listener : mListeners) {
+ for (IMidiDeviceListener listener : mListeners.values()) {
listener.onDeviceStatusChanged(status);
}
} catch (RemoteException e) {