Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69c3d450 authored by Xiang Wang's avatar Xiang Wang
Browse files

Reconnect Thermal AIDL HAL on failure

Initialize callback on wrapper creation, otherwise it may race with
the immediate callback from the Thermal HAL and result in NPE

Bug: b/205762943
Test: atest ThermalManagerServiceMockingTest + service restart test
Change-Id: I3648cd628dbdc05b57ad33f52b20c7ee2f201f65
parent 368f1c05
Loading
Loading
Loading
Loading
+28 −9
Original line number Diff line number Diff line
@@ -129,6 +129,9 @@ public class ThermalManagerService extends SystemService {
    ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) {
        super(context);
        mHalWrapper = halWrapper;
        if (halWrapper != null) {
            halWrapper.setCallback(this::onTemperatureChangedCallback);
        }
        mStatus = Temperature.THROTTLING_NONE;
    }

@@ -149,22 +152,21 @@ public class ThermalManagerService extends SystemService {
            // Connect to HAL and post to listeners.
            boolean halConnected = (mHalWrapper != null);
            if (!halConnected) {
                mHalWrapper = new ThermalHalAidlWrapper();
                mHalWrapper = new ThermalHalAidlWrapper(this::onTemperatureChangedCallback);
                halConnected = mHalWrapper.connectToHal();
            }
            if (!halConnected) {
                mHalWrapper = new ThermalHal20Wrapper();
                mHalWrapper = new ThermalHal20Wrapper(this::onTemperatureChangedCallback);
                halConnected = mHalWrapper.connectToHal();
            }
            if (!halConnected) {
                mHalWrapper = new ThermalHal11Wrapper();
                mHalWrapper = new ThermalHal11Wrapper(this::onTemperatureChangedCallback);
                halConnected = mHalWrapper.connectToHal();
            }
            if (!halConnected) {
                mHalWrapper = new ThermalHal10Wrapper();
                mHalWrapper = new ThermalHal10Wrapper(this::onTemperatureChangedCallback);
                halConnected = mHalWrapper.connectToHal();
            }
            mHalWrapper.setCallback(this::onTemperatureChangedCallback);
            if (!halConnected) {
                Slog.w(TAG, "No Thermal HAL service on this device");
                return;
@@ -723,6 +725,10 @@ public class ThermalManagerService extends SystemService {
            }
        };

        ThermalHalAidlWrapper(TemperatureChangedCallback callback) {
            mCallback = callback;
        }

        @Override
        protected List<Temperature> getCurrentTemperatures(boolean shouldFilter,
                int type) {
@@ -832,9 +838,10 @@ public class ThermalManagerService extends SystemService {
                        binder.linkToDeath(this, 0);
                    } catch (RemoteException e) {
                        Slog.e(TAG, "Unable to connect IThermal AIDL instance", e);
                        mInstance = null;
                        connectToHal();
                    }
                    if (mInstance != null) {
                        Slog.i(TAG, "Thermal HAL AIDL service connected.");
                        registerThermalChangedCallback();
                    }
                }
@@ -850,7 +857,7 @@ public class ThermalManagerService extends SystemService {
                        e);
            } catch (RemoteException e) {
                Slog.e(TAG, "Unable to connect IThermal AIDL instance", e);
                mInstance = null;
                connectToHal();
            }
        }

@@ -866,8 +873,8 @@ public class ThermalManagerService extends SystemService {

        @Override
        public synchronized void binderDied() {
            Slog.w(TAG, "IThermal HAL instance died");
            mInstance = null;
            Slog.w(TAG, "Thermal AIDL HAL died, reconnecting...");
            connectToHal();
        }
    }

@@ -876,6 +883,10 @@ public class ThermalManagerService extends SystemService {
        @GuardedBy("mHalLock")
        private android.hardware.thermal.V1_0.IThermal mThermalHal10 = null;

        ThermalHal10Wrapper(TemperatureChangedCallback callback) {
            mCallback = callback;
        }

        @Override
        protected List<Temperature> getCurrentTemperatures(boolean shouldFilter,
                int type) {
@@ -1011,6 +1022,10 @@ public class ThermalManagerService extends SystemService {
                    }
                };

        ThermalHal11Wrapper(TemperatureChangedCallback callback) {
            mCallback = callback;
        }

        @Override
        protected List<Temperature> getCurrentTemperatures(boolean shouldFilter,
                int type) {
@@ -1145,6 +1160,10 @@ public class ThermalManagerService extends SystemService {
                    }
                };

        ThermalHal20Wrapper(TemperatureChangedCallback callback) {
            mCallback = callback;
        }

        @Override
        protected List<Temperature> getCurrentTemperatures(boolean shouldFilter,
                int type) {
+1 −2
Original line number Diff line number Diff line
@@ -61,8 +61,7 @@ public class ThermalManagerServiceMockingTest {
        mAidlBinder.attachInterface(mAidlHalMock, IThermal.class.getName());
        mTemperatureFuture = new CompletableFuture<>();
        mTemperatureCallback = temperature -> mTemperatureFuture.complete(temperature);
        mAidlWrapper = new ThermalManagerService.ThermalHalAidlWrapper();
        mAidlWrapper.setCallback(mTemperatureCallback);
        mAidlWrapper = new ThermalManagerService.ThermalHalAidlWrapper(mTemperatureCallback);
        mAidlWrapper.initProxyAndRegisterCallback(mAidlBinder);
    }