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

Commit d781ff68 authored by Kalesh Singh's avatar Kalesh Singh
Browse files

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
parent dc52bd51
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -152,21 +152,34 @@ 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"));
            mSuspendControlService = waitForSuspendControlService();
        } catch (ServiceNotFoundException e) {
            Slog.wtf(TAG, "Required service suspend_control not available", e);
            return null;
        }
        }

        try {
            wlStats = mSuspendControlService.getWakeLockStats();