Loading services/core/java/com/android/server/power/PowerManagerService.java +29 −22 Original line number Diff line number Diff line Loading @@ -1694,6 +1694,7 @@ public final class PowerManagerService extends SystemService } applyWakeLockFlagsOnAcquireLocked(wakeLock); addFrozenStateChangeCallbacksLocked(wakeLock); mDirty |= DIRTY_WAKE_LOCKS; updatePowerStateLocked(); if (notifyAcquire) { Loading Loading @@ -1864,7 +1865,25 @@ public final class PowerManagerService extends SystemService } } private void removeWakelockFrozenStateReferences(WakeLock wakelock) { private void addFrozenStateChangeCallbacksLocked(WakeLock wakelock) { if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { wakelock.mLock.addFrozenStateChangeCallback(wakelock); } catch (UnsupportedOperationException e) { // Ignore the exception. The callback is not supported on this platform or on // this binder. The callback is never supported for local binders. There is // no error. A log message is provided for debug. if (DEBUG_SPEW) { Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + wakelock.mTag + " " + e.getLocalizedMessage()); } } catch (RemoteException e) { throw new RuntimeException(e); } } } private void removeFrozenStateChangeCallbacksLocked(WakeLock wakelock) { if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { wakelock.mLock.removeFrozenStateChangeCallback(wakelock); Loading @@ -1873,6 +1892,8 @@ public final class PowerManagerService extends SystemService Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + wakelock.mTag + " " + e.getLocalizedMessage()); } } catch (IllegalArgumentException e) { Slog.v(TAG, "FrozenStateChangeCallback was already unregistered"); } } } Loading Loading @@ -1900,13 +1921,14 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private void removeWakeLockLocked(WakeLock wakeLock, int index) { removeFrozenStateChangeCallbacksLocked(wakeLock); removeWakeLockNoUpdateLocked(wakeLock, index); updatePowerStateLocked(); } @GuardedBy("mLock") private void removeWakeLockDeathLocked(WakeLock wakeLock, int index) { removeWakelockFrozenStateReferences(wakeLock); removeFrozenStateChangeCallbacksLocked(wakeLock); removeWakeLockNoUpdateLocked(wakeLock, index, RELEASE_REASON_WAKE_LOCK_DEATH); updatePowerStateLocked(); } Loading Loading @@ -4516,11 +4538,6 @@ public final class PowerManagerService extends SystemService return mDeviceIdleMode || (mLightDeviceIdleMode && disableWakelocksInLightIdle()); } @GuardedBy("mLock") private void updateWakeLockDisabledStatesLocked() { updateWakeLockDisabledStatesLocked(mWakeLocks); } @GuardedBy("mLock") private void updateWakeLockDisabledStatesLocked(List<WakeLock> wakelocks) { boolean changed = false; Loading @@ -4547,6 +4564,11 @@ public final class PowerManagerService extends SystemService } } @GuardedBy("mLock") private void updateWakeLockDisabledStatesLocked() { updateWakeLockDisabledStatesLocked(mWakeLocks); } @GuardedBy("mLock") private boolean setWakeLockDisabledStateLocked(WakeLock wakeLock) { boolean disabled = false; Loading Loading @@ -5687,21 +5709,6 @@ public final class PowerManagerService extends SystemService mOwnerPid = ownerPid; mUidState = uidState; mCallback = callback; if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { lock.addFrozenStateChangeCallback(this); } catch (UnsupportedOperationException e) { // Ignore the exception. The callback is not supported on this platform or on // this binder. The callback is never supported for local binders. There is // no error. A log message is provided for debug. if (DEBUG_SPEW) { Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + tag + " " + e.getLocalizedMessage()); } } catch (RemoteException e) { throw new RuntimeException(e); } } linkToDeath(); } Loading services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -3677,10 +3677,10 @@ public class PowerManagerServiceTest { IBinder mockBinder = mock(IBinder.class); doNothing().when(mockBinder).addFrozenStateChangeCallback(any()); when(mockBinder.removeFrozenStateChangeCallback(any())).thenReturn(true); WakeLock wakeLock = acquireWakeLock("frozenTestWakeLock", PowerManager.PARTIAL_WAKE_LOCK, mockBinder, Display.INVALID_DISPLAY); verify(mockBinder).addFrozenStateChangeCallback(wakeLock); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); advanceTime(1000); Loading @@ -3696,6 +3696,10 @@ public class PowerManagerServiceTest { advanceTime(1000); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); when(mockBinder.removeFrozenStateChangeCallback(wakeLock)).thenReturn(true); mService.getBinderServiceInstance().releaseWakeLock(mockBinder, 0); verify(mockBinder).removeFrozenStateChangeCallback(wakeLock); } @Test Loading Loading
services/core/java/com/android/server/power/PowerManagerService.java +29 −22 Original line number Diff line number Diff line Loading @@ -1694,6 +1694,7 @@ public final class PowerManagerService extends SystemService } applyWakeLockFlagsOnAcquireLocked(wakeLock); addFrozenStateChangeCallbacksLocked(wakeLock); mDirty |= DIRTY_WAKE_LOCKS; updatePowerStateLocked(); if (notifyAcquire) { Loading Loading @@ -1864,7 +1865,25 @@ public final class PowerManagerService extends SystemService } } private void removeWakelockFrozenStateReferences(WakeLock wakelock) { private void addFrozenStateChangeCallbacksLocked(WakeLock wakelock) { if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { wakelock.mLock.addFrozenStateChangeCallback(wakelock); } catch (UnsupportedOperationException e) { // Ignore the exception. The callback is not supported on this platform or on // this binder. The callback is never supported for local binders. There is // no error. A log message is provided for debug. if (DEBUG_SPEW) { Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + wakelock.mTag + " " + e.getLocalizedMessage()); } } catch (RemoteException e) { throw new RuntimeException(e); } } } private void removeFrozenStateChangeCallbacksLocked(WakeLock wakelock) { if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { wakelock.mLock.removeFrozenStateChangeCallback(wakelock); Loading @@ -1873,6 +1892,8 @@ public final class PowerManagerService extends SystemService Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + wakelock.mTag + " " + e.getLocalizedMessage()); } } catch (IllegalArgumentException e) { Slog.v(TAG, "FrozenStateChangeCallback was already unregistered"); } } } Loading Loading @@ -1900,13 +1921,14 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private void removeWakeLockLocked(WakeLock wakeLock, int index) { removeFrozenStateChangeCallbacksLocked(wakeLock); removeWakeLockNoUpdateLocked(wakeLock, index); updatePowerStateLocked(); } @GuardedBy("mLock") private void removeWakeLockDeathLocked(WakeLock wakeLock, int index) { removeWakelockFrozenStateReferences(wakeLock); removeFrozenStateChangeCallbacksLocked(wakeLock); removeWakeLockNoUpdateLocked(wakeLock, index, RELEASE_REASON_WAKE_LOCK_DEATH); updatePowerStateLocked(); } Loading Loading @@ -4516,11 +4538,6 @@ public final class PowerManagerService extends SystemService return mDeviceIdleMode || (mLightDeviceIdleMode && disableWakelocksInLightIdle()); } @GuardedBy("mLock") private void updateWakeLockDisabledStatesLocked() { updateWakeLockDisabledStatesLocked(mWakeLocks); } @GuardedBy("mLock") private void updateWakeLockDisabledStatesLocked(List<WakeLock> wakelocks) { boolean changed = false; Loading @@ -4547,6 +4564,11 @@ public final class PowerManagerService extends SystemService } } @GuardedBy("mLock") private void updateWakeLockDisabledStatesLocked() { updateWakeLockDisabledStatesLocked(mWakeLocks); } @GuardedBy("mLock") private boolean setWakeLockDisabledStateLocked(WakeLock wakeLock) { boolean disabled = false; Loading Loading @@ -5687,21 +5709,6 @@ public final class PowerManagerService extends SystemService mOwnerPid = ownerPid; mUidState = uidState; mCallback = callback; if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { lock.addFrozenStateChangeCallback(this); } catch (UnsupportedOperationException e) { // Ignore the exception. The callback is not supported on this platform or on // this binder. The callback is never supported for local binders. There is // no error. A log message is provided for debug. if (DEBUG_SPEW) { Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + tag + " " + e.getLocalizedMessage()); } } catch (RemoteException e) { throw new RuntimeException(e); } } linkToDeath(); } Loading
services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -3677,10 +3677,10 @@ public class PowerManagerServiceTest { IBinder mockBinder = mock(IBinder.class); doNothing().when(mockBinder).addFrozenStateChangeCallback(any()); when(mockBinder.removeFrozenStateChangeCallback(any())).thenReturn(true); WakeLock wakeLock = acquireWakeLock("frozenTestWakeLock", PowerManager.PARTIAL_WAKE_LOCK, mockBinder, Display.INVALID_DISPLAY); verify(mockBinder).addFrozenStateChangeCallback(wakeLock); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); advanceTime(1000); Loading @@ -3696,6 +3696,10 @@ public class PowerManagerServiceTest { advanceTime(1000); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); when(mockBinder.removeFrozenStateChangeCallback(wakeLock)).thenReturn(true); mService.getBinderServiceInstance().releaseWakeLock(mockBinder, 0); verify(mockBinder).removeFrozenStateChangeCallback(wakeLock); } @Test Loading