Fix the deadlock issue
Reduce the locked code.
Flag: EXEMPT bugfix
Bug: 350897503
Bug: 290822251
Test: atest com.android.server.wifi
Change-Id: I497b8a7db2a8ce0c78735c3805dbdf5e91fe8ca6
diff --git a/service/java/com/android/server/wifi/HalDeviceManager.java b/service/java/com/android/server/wifi/HalDeviceManager.java
index 0959c31..91eff74 100644
--- a/service/java/com/android/server/wifi/HalDeviceManager.java
+++ b/service/java/com/android/server/wifi/HalDeviceManager.java
@@ -67,7 +67,6 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -2523,6 +2522,7 @@
return false;
}
+ boolean success = false;
synchronized (mLock) {
WifiChip chip = getChip(iface);
if (chip == null) {
@@ -2535,7 +2535,6 @@
return false;
}
- boolean success = false;
switch (type) {
case WifiChip.IFACE_TYPE_STA:
mClientModeManagers.remove(name);
@@ -2554,20 +2553,20 @@
Log.wtf(TAG, "removeIfaceInternal: invalid type=" + type);
return false;
}
+ }
- // dispatch listeners no matter what status
- dispatchDestroyedListeners(name, type);
- if (validateRttController) {
- // Try to update the RttController
- updateRttControllerWhenInterfaceChanges();
- }
+ // dispatch listeners no matter what status
+ dispatchDestroyedListeners(name, type);
+ if (validateRttController) {
+ // Try to update the RttController
+ updateRttControllerWhenInterfaceChanges();
+ }
- if (success) {
- return true;
- } else {
- Log.e(TAG, "IWifiChip.removeXxxIface failed, name=" + name + ", type=" + type);
- return false;
- }
+ if (success) {
+ return true;
+ } else {
+ Log.e(TAG, "IWifiChip.removeXxxIface failed, name=" + name + ", type=" + type);
+ return false;
}
}
@@ -2577,20 +2576,19 @@
// onlyOnOtherThreads = false: call all listeners
private void dispatchDestroyedListeners(String name, int type) {
if (VDBG) Log.d(TAG, "dispatchDestroyedListeners: iface(name)=" + name);
+ InterfaceCacheEntry entry;
+ List<InterfaceDestroyedListenerProxy> triggerList;
synchronized (mLock) {
- InterfaceCacheEntry entry = mInterfaceInfoCache.remove(Pair.create(name, type));
+ entry = mInterfaceInfoCache.remove(Pair.create(name, type));
if (entry == null) {
Log.e(TAG, "dispatchDestroyedListeners: no cache entry for iface(name)=" + name);
return;
}
-
- Iterator<InterfaceDestroyedListenerProxy> iterator =
- entry.destroyedListeners.iterator();
- while (iterator.hasNext()) {
- InterfaceDestroyedListenerProxy listener = iterator.next();
- iterator.remove();
- listener.action();
- }
+ triggerList = new ArrayList<>(entry.destroyedListeners);
+ entry.destroyedListeners.clear();
+ }
+ for (InterfaceDestroyedListenerProxy listener : triggerList) {
+ listener.action();
}
}
@@ -2601,9 +2599,7 @@
List<InterfaceDestroyedListenerProxy> triggerList = new ArrayList<>();
synchronized (mLock) {
for (InterfaceCacheEntry cacheEntry: mInterfaceInfoCache.values()) {
- for (InterfaceDestroyedListenerProxy listener : cacheEntry.destroyedListeners) {
- triggerList.add(listener);
- }
+ triggerList.addAll(cacheEntry.destroyedListeners);
cacheEntry.destroyedListeners.clear(); // for insurance
}
mInterfaceInfoCache.clear();