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:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user