Loading services/java/com/android/server/power/PowerManagerService.java +66 −33 Original line number Diff line number Diff line Loading @@ -238,11 +238,20 @@ public final class PowerManagerService extends IPowerManager.Stub // is actually on or actually off or whatever was requested. private boolean mDisplayReady; // True if holding a wake-lock to block suspend of the CPU. // The suspend blocker used to keep the CPU alive when an application has acquired // a wake lock. private final SuspendBlocker mWakeLockSuspendBlocker; // True if the wake lock suspend blocker has been acquired. private boolean mHoldingWakeLockSuspendBlocker; // The suspend blocker used to keep the CPU alive when wake locks have been acquired. private final SuspendBlocker mWakeLockSuspendBlocker; // The suspend blocker used to keep the CPU alive when the display is on, the // display is getting ready or there is user activity (in which case the display // must be on). private final SuspendBlocker mDisplaySuspendBlocker; // True if the display suspend blocker has been acquired. private boolean mHoldingDisplaySuspendBlocker; // The screen on blocker used to keep the screen from turning on while the lock // screen is coming up. Loading Loading @@ -368,11 +377,13 @@ public final class PowerManagerService extends IPowerManager.Stub public PowerManagerService() { synchronized (mLock) { mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService"); mWakeLockSuspendBlocker.acquire(); mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks"); mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display"); mDisplaySuspendBlocker.acquire(); mHoldingDisplaySuspendBlocker = true; mScreenOnBlocker = new ScreenOnBlockerImpl(); mDisplayBlanker = new DisplayBlankerImpl(); mHoldingWakeLockSuspendBlocker = true; mWakefulness = WAKEFULNESS_AWAKE; } Loading Loading @@ -653,17 +664,21 @@ public final class PowerManagerService extends IPowerManager.Stub private void releaseWakeLockInternal(IBinder lock, int flags) { synchronized (mLock) { int index = findWakeLockIndexLocked(lock); if (index < 0) { if (DEBUG_SPEW) { Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock) + ", flags=0x" + Integer.toHexString(flags)); + " [not found], flags=0x" + Integer.toHexString(flags)); } int index = findWakeLockIndexLocked(lock); if (index < 0) { return; } WakeLock wakeLock = mWakeLocks.get(index); if (DEBUG_SPEW) { Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock) + " [" + wakeLock.mTag + "], flags=0x" + Integer.toHexString(flags)); } mWakeLocks.remove(index); notifyWakeLockReleasedLocked(wakeLock); wakeLock.mLock.unlinkToDeath(wakeLock, 0); Loading @@ -681,7 +696,8 @@ public final class PowerManagerService extends IPowerManager.Stub private void handleWakeLockDeath(WakeLock wakeLock) { synchronized (mLock) { if (DEBUG_SPEW) { Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock)); Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock) + " [" + wakeLock.mTag + "]"); } int index = mWakeLocks.indexOf(wakeLock); Loading Loading @@ -733,10 +749,19 @@ public final class PowerManagerService extends IPowerManager.Stub synchronized (mLock) { int index = findWakeLockIndexLocked(lock); if (index < 0) { if (DEBUG_SPEW) { Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock) + " [not found], ws=" + ws); } throw new IllegalArgumentException("Wake lock not active"); } WakeLock wakeLock = mWakeLocks.get(index); if (DEBUG_SPEW) { Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock) + " [" + wakeLock.mTag + "], ws=" + ws); } if (!wakeLock.hasSameWorkSource(ws)) { notifyWakeLockReleasedLocked(wakeLock); wakeLock.updateWorkSource(ws); Loading Loading @@ -1719,29 +1744,30 @@ public final class PowerManagerService extends IPowerManager.Stub * This function must have no other side-effects. */ private void updateSuspendBlockerLocked() { boolean wantCpu = isCpuNeededLocked(); if (wantCpu != mHoldingWakeLockSuspendBlocker) { mHoldingWakeLockSuspendBlocker = wantCpu; if (wantCpu) { if (DEBUG) { Slog.d(TAG, "updateSuspendBlockerLocked: Acquiring suspend blocker."); } final boolean needWakeLockSuspendBlocker = (mWakeLockSummary != 0); final boolean needDisplaySuspendBlocker = (mUserActivitySummary != 0 || mDisplayPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF || !mDisplayReady || !mBootCompleted); // First acquire suspend blockers if needed. if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) { mWakeLockSuspendBlocker.acquire(); } else { if (DEBUG) { Slog.d(TAG, "updateSuspendBlockerLocked: Releasing suspend blocker."); mHoldingWakeLockSuspendBlocker = true; } mWakeLockSuspendBlocker.release(); if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) { mDisplaySuspendBlocker.acquire(); mHoldingDisplaySuspendBlocker = true; } // Then release suspend blockers if needed. if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) { mWakeLockSuspendBlocker.release(); mHoldingWakeLockSuspendBlocker = false; } if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) { mDisplaySuspendBlocker.release(); mHoldingDisplaySuspendBlocker = false; } private boolean isCpuNeededLocked() { return !mBootCompleted || mWakeLockSummary != 0 || mUserActivitySummary != 0 || mDisplayPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF || !mDisplayReady; } @Override // Binder call Loading Loading @@ -2211,6 +2237,7 @@ public final class PowerManagerService extends IPowerManager.Stub + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights)); pw.println(" mDisplayReady=" + mDisplayReady); pw.println(" mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker); pw.println(" mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker); pw.println(); pw.println("Settings and Configuration:"); Loading Loading @@ -2506,6 +2533,9 @@ public final class PowerManagerService extends IPowerManager.Stub synchronized (this) { mReferenceCount += 1; if (mReferenceCount == 1) { if (DEBUG_SPEW) { Slog.d(TAG, "Acquiring suspend blocker \"" + mName + "\"."); } nativeAcquireSuspendBlocker(mName); } } Loading @@ -2516,6 +2546,9 @@ public final class PowerManagerService extends IPowerManager.Stub synchronized (this) { mReferenceCount -= 1; if (mReferenceCount == 0) { if (DEBUG_SPEW) { Slog.d(TAG, "Releasing suspend blocker \"" + mName + "\"."); } nativeReleaseSuspendBlocker(mName); } else if (mReferenceCount < 0) { Log.wtf(TAG, "Suspend blocker \"" + mName Loading Loading
services/java/com/android/server/power/PowerManagerService.java +66 −33 Original line number Diff line number Diff line Loading @@ -238,11 +238,20 @@ public final class PowerManagerService extends IPowerManager.Stub // is actually on or actually off or whatever was requested. private boolean mDisplayReady; // True if holding a wake-lock to block suspend of the CPU. // The suspend blocker used to keep the CPU alive when an application has acquired // a wake lock. private final SuspendBlocker mWakeLockSuspendBlocker; // True if the wake lock suspend blocker has been acquired. private boolean mHoldingWakeLockSuspendBlocker; // The suspend blocker used to keep the CPU alive when wake locks have been acquired. private final SuspendBlocker mWakeLockSuspendBlocker; // The suspend blocker used to keep the CPU alive when the display is on, the // display is getting ready or there is user activity (in which case the display // must be on). private final SuspendBlocker mDisplaySuspendBlocker; // True if the display suspend blocker has been acquired. private boolean mHoldingDisplaySuspendBlocker; // The screen on blocker used to keep the screen from turning on while the lock // screen is coming up. Loading Loading @@ -368,11 +377,13 @@ public final class PowerManagerService extends IPowerManager.Stub public PowerManagerService() { synchronized (mLock) { mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService"); mWakeLockSuspendBlocker.acquire(); mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks"); mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display"); mDisplaySuspendBlocker.acquire(); mHoldingDisplaySuspendBlocker = true; mScreenOnBlocker = new ScreenOnBlockerImpl(); mDisplayBlanker = new DisplayBlankerImpl(); mHoldingWakeLockSuspendBlocker = true; mWakefulness = WAKEFULNESS_AWAKE; } Loading Loading @@ -653,17 +664,21 @@ public final class PowerManagerService extends IPowerManager.Stub private void releaseWakeLockInternal(IBinder lock, int flags) { synchronized (mLock) { int index = findWakeLockIndexLocked(lock); if (index < 0) { if (DEBUG_SPEW) { Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock) + ", flags=0x" + Integer.toHexString(flags)); + " [not found], flags=0x" + Integer.toHexString(flags)); } int index = findWakeLockIndexLocked(lock); if (index < 0) { return; } WakeLock wakeLock = mWakeLocks.get(index); if (DEBUG_SPEW) { Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock) + " [" + wakeLock.mTag + "], flags=0x" + Integer.toHexString(flags)); } mWakeLocks.remove(index); notifyWakeLockReleasedLocked(wakeLock); wakeLock.mLock.unlinkToDeath(wakeLock, 0); Loading @@ -681,7 +696,8 @@ public final class PowerManagerService extends IPowerManager.Stub private void handleWakeLockDeath(WakeLock wakeLock) { synchronized (mLock) { if (DEBUG_SPEW) { Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock)); Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock) + " [" + wakeLock.mTag + "]"); } int index = mWakeLocks.indexOf(wakeLock); Loading Loading @@ -733,10 +749,19 @@ public final class PowerManagerService extends IPowerManager.Stub synchronized (mLock) { int index = findWakeLockIndexLocked(lock); if (index < 0) { if (DEBUG_SPEW) { Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock) + " [not found], ws=" + ws); } throw new IllegalArgumentException("Wake lock not active"); } WakeLock wakeLock = mWakeLocks.get(index); if (DEBUG_SPEW) { Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock) + " [" + wakeLock.mTag + "], ws=" + ws); } if (!wakeLock.hasSameWorkSource(ws)) { notifyWakeLockReleasedLocked(wakeLock); wakeLock.updateWorkSource(ws); Loading Loading @@ -1719,29 +1744,30 @@ public final class PowerManagerService extends IPowerManager.Stub * This function must have no other side-effects. */ private void updateSuspendBlockerLocked() { boolean wantCpu = isCpuNeededLocked(); if (wantCpu != mHoldingWakeLockSuspendBlocker) { mHoldingWakeLockSuspendBlocker = wantCpu; if (wantCpu) { if (DEBUG) { Slog.d(TAG, "updateSuspendBlockerLocked: Acquiring suspend blocker."); } final boolean needWakeLockSuspendBlocker = (mWakeLockSummary != 0); final boolean needDisplaySuspendBlocker = (mUserActivitySummary != 0 || mDisplayPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF || !mDisplayReady || !mBootCompleted); // First acquire suspend blockers if needed. if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) { mWakeLockSuspendBlocker.acquire(); } else { if (DEBUG) { Slog.d(TAG, "updateSuspendBlockerLocked: Releasing suspend blocker."); mHoldingWakeLockSuspendBlocker = true; } mWakeLockSuspendBlocker.release(); if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) { mDisplaySuspendBlocker.acquire(); mHoldingDisplaySuspendBlocker = true; } // Then release suspend blockers if needed. if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) { mWakeLockSuspendBlocker.release(); mHoldingWakeLockSuspendBlocker = false; } if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) { mDisplaySuspendBlocker.release(); mHoldingDisplaySuspendBlocker = false; } private boolean isCpuNeededLocked() { return !mBootCompleted || mWakeLockSummary != 0 || mUserActivitySummary != 0 || mDisplayPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF || !mDisplayReady; } @Override // Binder call Loading Loading @@ -2211,6 +2237,7 @@ public final class PowerManagerService extends IPowerManager.Stub + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights)); pw.println(" mDisplayReady=" + mDisplayReady); pw.println(" mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker); pw.println(" mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker); pw.println(); pw.println("Settings and Configuration:"); Loading Loading @@ -2506,6 +2533,9 @@ public final class PowerManagerService extends IPowerManager.Stub synchronized (this) { mReferenceCount += 1; if (mReferenceCount == 1) { if (DEBUG_SPEW) { Slog.d(TAG, "Acquiring suspend blocker \"" + mName + "\"."); } nativeAcquireSuspendBlocker(mName); } } Loading @@ -2516,6 +2546,9 @@ public final class PowerManagerService extends IPowerManager.Stub synchronized (this) { mReferenceCount -= 1; if (mReferenceCount == 0) { if (DEBUG_SPEW) { Slog.d(TAG, "Releasing suspend blocker \"" + mName + "\"."); } nativeReleaseSuspendBlocker(mName); } else if (mReferenceCount < 0) { Log.wtf(TAG, "Suspend blocker \"" + mName Loading