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
This commit is contained in:
Xiang Wang
2023-01-26 15:16:08 -08:00
parent 368f1c05e7
commit 69c3d450cb
2 changed files with 29 additions and 11 deletions

View File

@@ -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) {

View File

@@ -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);
}