From 6dea37dc6e1f8723a774cd203cb99c48079603e7 Mon Sep 17 00:00:00 2001 From: Iris Chang Date: Fri, 25 Jan 2019 13:36:34 +0800 Subject: [PATCH] Fix RouterAdvertisementDaemon thread leakage problem [Prerequisites] Default value of mRaLength is 0, so getNextMulticastTransmitDelaySec() returns DAY_IN_SECONDS (1 day) in this scenario. [Issue Details] Examine MulticastTransmitter.run() for detail: 676 public void run() { 677 while (isSocketValid()) { 678 try { 679 Thread.sleep(getNextMulticastTransmitDelayMs()); Invoke RouterAdvertisementDaemon.stop() here. Since MulticastTransmitter is in a sleep, this thread will pend 1 day until the next check of isSocketValid() triggers the quit action, which causes thread leakage during Wi-Fi Hotspot on/off stress test. 680 } catch (InterruptedException ignored) { [Solution] Invoke maybeNotifyMulticastTransmitter() after closing socket in RouterAdvertisementDaemon.stop() to interrupt MulticastTransmitter from waiting. Bug: 123491872 Test: FrameworksNetTests adb shell am instrument -w com.android.frameworks.tests.net Test: CTS - CtsNetTestCases ANDROID_BUILD_droid-cts/tools/cts-tradefed run cts -m CtsNetTestCases Test: CTS - CtsNetTestCasesLegacyApi22 ANDROID_BUILD_droid-cts/tools/cts-tradefed run cts -m CtsNetTestCasesLegacyApi22 Test: CTS - CtsNetTestCasesLegacyPermission22 ANDROID_BUILD_droid-cts/tools/cts-tradefed run cts -m CtsNetTestCasesLegacyPermission22 Change-Id: I0c0d63b43a88e1026aaecfc1853309ad63f62268 --- .../net/java/android/net/ip/RouterAdvertisementDaemon.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/net/java/android/net/ip/RouterAdvertisementDaemon.java b/services/net/java/android/net/ip/RouterAdvertisementDaemon.java index 8e3023bc08d48..339607bbc73d6 100644 --- a/services/net/java/android/net/ip/RouterAdvertisementDaemon.java +++ b/services/net/java/android/net/ip/RouterAdvertisementDaemon.java @@ -275,6 +275,9 @@ public class RouterAdvertisementDaemon { public void stop() { closeSocket(); + // Wake up mMulticastTransmitter thread to interrupt a potential 1 day sleep before + // the thread's termination. + maybeNotifyMulticastTransmitter(); mMulticastTransmitter = null; mUnicastResponder = null; }