summaryrefslogtreecommitdiffstats
path: root/service/java/com/android/server/wifi/WifiMonitor.java
diff options
context:
space:
mode:
authorRandy Pan <zpan@google.com>2017-05-02 14:52:40 -0700
committerRandy Pan <zpan@google.com>2017-05-04 14:58:45 -0700
commit098640f533f3fc04cb49cb860f9dc45ad8a19e69 (patch)
tree37e47cba1bad8bac4667570336cf2930aad5324f /service/java/com/android/server/wifi/WifiMonitor.java
parent5213be94c3b27fff928f5f221e5951c7ede1058b (diff)
downloadandroid_frameworks_opt_net_wifi-098640f533f3fc04cb49cb860f9dc45ad8a19e69.tar.gz
android_frameworks_opt_net_wifi-098640f533f3fc04cb49cb860f9dc45ad8a19e69.tar.bz2
android_frameworks_opt_net_wifi-098640f533f3fc04cb49cb860f9dc45ad8a19e69.zip
Fix how WifiMonitor/WifiP2pMonitor sends a message
A message can potentially have multiple handlers. Looper recycles the message after one handler is done with it. Sending/copying the recycled message to another handler is problematic. Fix the issue by always sending a copy of the original message. Bug: 37714369 Test: runtest.sh Change-Id: I2f4a4903ac8da94816341def969878f888154b6c
Diffstat (limited to 'service/java/com/android/server/wifi/WifiMonitor.java')
-rw-r--r--service/java/com/android/server/wifi/WifiMonitor.java20
1 files changed, 6 insertions, 14 deletions
diff --git a/service/java/com/android/server/wifi/WifiMonitor.java b/service/java/com/android/server/wifi/WifiMonitor.java
index d1903a0de..385bfccaa 100644
--- a/service/java/com/android/server/wifi/WifiMonitor.java
+++ b/service/java/com/android/server/wifi/WifiMonitor.java
@@ -262,14 +262,10 @@ public class WifiMonitor {
SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
if (iface != null && ifaceHandlers != null) {
if (isMonitoring(iface)) {
- boolean firstHandler = true;
Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what);
if (ifaceWhatHandlers != null) {
for (Handler handler : ifaceWhatHandlers) {
- if (firstHandler) {
- firstHandler = false;
- sendMessage(handler, message);
- } else {
+ if (handler != null) {
sendMessage(handler, Message.obtain(message));
}
}
@@ -283,28 +279,24 @@ public class WifiMonitor {
if (mVerboseLoggingEnabled) {
Log.d(TAG, "Sending to all monitors because there's no matching iface");
}
- boolean firstHandler = true;
for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) {
if (isMonitoring(entry.getKey())) {
Set<Handler> ifaceWhatHandlers = entry.getValue().get(message.what);
for (Handler handler : ifaceWhatHandlers) {
- if (firstHandler) {
- firstHandler = false;
- sendMessage(handler, message);
- } else {
+ if (handler != null) {
sendMessage(handler, Message.obtain(message));
}
}
}
}
}
+
+ message.recycle();
}
private void sendMessage(Handler handler, Message message) {
- if (handler != null) {
- message.setTarget(handler);
- message.sendToTarget();
- }
+ message.setTarget(handler);
+ message.sendToTarget();
}
/**