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();