Fixed race condition while powering down
Made sure powerOffRadioSafely is also run in the main thread
so that it can access DataNetworkController without synchronization.
Fix: 378616116
Test: atest FrameworksTelephonyTests
Test: Manuall power down the device on Pixel 7
Flag: com.android.internal.telephony.flags.power_down_race_fix
Change-Id: Ic645fb9cb324a31274e9dce4a6797694ce996cc8
diff --git a/flags/misc.aconfig b/flags/misc.aconfig
index 303c0ff..03d1f4e 100644
--- a/flags/misc.aconfig
+++ b/flags/misc.aconfig
@@ -220,3 +220,13 @@
}
}
+# OWNER=jackyu TARGET=25Q2
+flag {
+ name: "power_down_race_fix"
+ namespace: "telephony"
+ description: "Fixed race condition while powering down"
+ bug:"378616116"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index a91000e..6a6e4d0 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -1893,8 +1893,15 @@
@Override
public void setRadioPowerForReason(boolean power, boolean forEmergencyCall,
boolean isSelectedPhoneForEmergencyCall, boolean forceApply, int reason) {
- mSST.setRadioPowerForReason(power, forEmergencyCall, isSelectedPhoneForEmergencyCall,
- forceApply, reason);
+ if (mFeatureFlags.powerDownRaceFix()) {
+ // setRadioPowerForReason can be called by the binder thread. We need to move that into
+ // the main thread to prevent race condition.
+ post(() -> mSST.setRadioPowerForReason(power, forEmergencyCall,
+ isSelectedPhoneForEmergencyCall, forceApply, reason));
+ } else {
+ mSST.setRadioPowerForReason(power, forEmergencyCall, isSelectedPhoneForEmergencyCall,
+ forceApply, reason);
+ }
}
@Override