Don't cache suspend_control service

Caching a reference to the service can lead to a DeadObject if
if the service was restarted. Additially we attempt to wait for
the service if it is not immediately available.

Bug: 160741383
Test: atest FrameworksCoreTests:KernelWakelockReaderTest

Change-Id: If54d644a66bed8a0da6a2f5b34168cad8f954187
This commit is contained in:
Kalesh Singh
2020-07-09 20:13:30 +00:00
parent dc52bd51d8
commit d781ff68f1

View File

@@ -152,20 +152,33 @@ public class KernelWakelockReader {
}
}
/**
* Attempt to wait for suspend_control service if not immediately available.
*/
private ISuspendControlService waitForSuspendControlService() throws ServiceNotFoundException {
final String name = "suspend_control";
final int numRetries = 5;
for (int i = 0; i < numRetries; i++) {
mSuspendControlService = ISuspendControlService.Stub.asInterface(
ServiceManager.getService(name));
if (mSuspendControlService != null) {
return mSuspendControlService;
}
}
throw new ServiceNotFoundException(name);
}
/**
* On success, returns the updated stats from SystemSupend, else returns null.
*/
private KernelWakelockStats getWakelockStatsFromSystemSuspend(
final KernelWakelockStats staleStats) {
WakeLockInfo[] wlStats = null;
if (mSuspendControlService == null) {
try {
mSuspendControlService = ISuspendControlService.Stub.asInterface(
ServiceManager.getServiceOrThrow("suspend_control"));
} catch (ServiceNotFoundException e) {
Slog.wtf(TAG, "Required service suspend_control not available", e);
return null;
}
try {
mSuspendControlService = waitForSuspendControlService();
} catch (ServiceNotFoundException e) {
Slog.wtf(TAG, "Required service suspend_control not available", e);
return null;
}
try {