PowerManager: Adds the Sustained performance API.

Adds a new type of wakelock - SUSTAINED_PERFORMANCE_WAKELOCK. This
wakelock can only be acquired when the application is in the foreground.
And it is not effective when the application is no longer in the
foreground.

Acquiring this wakelock enables the Sustained performance mode which
guarantees a certain level of performance.

Bug: 22864186

Change-Id: Id0ececc756fe014779db6efde7aede23ea181dc5
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
This commit is contained in:
Ruchi Kandoi
2016-01-12 14:39:24 -08:00
parent 0bbf302573
commit 0abc001275
5 changed files with 79 additions and 7 deletions

View File

@@ -28553,6 +28553,7 @@ package android.os {
field public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1; // 0x1
field public static final deprecated int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
field public static final deprecated int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
field public static final int SUSTAINED_PERFORMANCE_WAKE_LOCK = 256; // 0x100
}
public final class PowerManager.WakeLock {

View File

@@ -30631,6 +30631,7 @@ package android.os {
field public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1; // 0x1
field public static final deprecated int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
field public static final deprecated int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
field public static final int SUSTAINED_PERFORMANCE_WAKE_LOCK = 256; // 0x100
field public static final int USER_ACTIVITY_EVENT_BUTTON = 1; // 0x1
field public static final int USER_ACTIVITY_EVENT_OTHER = 0; // 0x0
field public static final int USER_ACTIVITY_EVENT_TOUCH = 2; // 0x2

View File

@@ -28561,6 +28561,7 @@ package android.os {
field public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1; // 0x1
field public static final deprecated int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
field public static final deprecated int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
field public static final int SUSTAINED_PERFORMANCE_WAKE_LOCK = 256; // 0x100
}
public final class PowerManager.WakeLock {

View File

@@ -218,6 +218,15 @@ public final class PowerManager {
*/
public static final int DRAW_WAKE_LOCK = 0x00000080;
/**
* Wake lock level: Enables Sustained Performance Mode.
* <p>
* This is used by Gaming and VR applications to ensure the device provides
* will provide consistent performance over a large amount of time.
* </p>
*/
public static final int SUSTAINED_PERFORMANCE_WAKE_LOCK = 0x00000100;
/**
* Mask for the wake lock level component of a combined wake lock level and flags integer.
*
@@ -525,6 +534,7 @@ public final class PowerManager {
case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
case DOZE_WAKE_LOCK:
case DRAW_WAKE_LOCK:
case SUSTAINED_PERFORMANCE_WAKE_LOCK:
break;
default:
throw new IllegalArgumentException("Must specify a valid wake lock level.");

View File

@@ -131,6 +131,7 @@ public final class PowerManagerService extends SystemService
private static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
private static final int WAKE_LOCK_DOZE = 1 << 6;
private static final int WAKE_LOCK_DRAW = 1 << 7;
private static final int WAKE_LOCK_SUSTAINED_PERFORMANCE = 1 << 8;
// Summarizes the user activity state.
private static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
@@ -149,6 +150,7 @@ public final class PowerManagerService extends SystemService
// Power hints defined in hardware/libhardware/include/hardware/power.h.
private static final int POWER_HINT_LOW_POWER = 5;
private static final int POWER_HINT_SUSTAINED_PERFORMANCE = 6;
// Power features defined in hardware/libhardware/include/hardware/power.h.
private static final int POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 1;
@@ -444,6 +446,9 @@ public final class PowerManagerService extends SystemService
// True if we are currently in light device idle mode.
private boolean mLightDeviceIdleMode;
// True if we are currently in sustained performance mode.
private boolean mSustainedPerformanceMode;
// Set of app ids that we will always respect the wake locks for.
int[] mDeviceIdleWhitelist = new int[0];
@@ -452,6 +457,8 @@ public final class PowerManagerService extends SystemService
private final SparseIntArray mUidState = new SparseIntArray();
private final SparseIntArray mSustainedPerformanceUid = new SparseIntArray();
// True if theater mode is enabled
private boolean mTheaterModeEnabled;
@@ -811,6 +818,12 @@ public final class PowerManagerService extends SystemService
throw new IllegalArgumentException("Wake lock is already dead.");
}
mWakeLocks.add(wakeLock);
if ((flags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.SUSTAINED_PERFORMANCE_WAKE_LOCK) {
int numberWakelock = mSustainedPerformanceUid.get(uid);
mSustainedPerformanceUid.put(uid, numberWakelock + 1);
}
setWakeLockDisabledStateLocked(wakeLock);
notifyAcquire = true;
}
@@ -879,6 +892,17 @@ public final class PowerManagerService extends SystemService
mRequestWaitForNegativeProximity = true;
}
if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.SUSTAINED_PERFORMANCE_WAKE_LOCK) {
int numberWakelock = mSustainedPerformanceUid.get(wakeLock.mOwnerUid);
if (numberWakelock == 1) {
mSustainedPerformanceUid.delete(wakeLock.mOwnerUid);
} else {
mSustainedPerformanceUid.put(wakeLock.mOwnerUid, numberWakelock - 1);
}
}
wakeLock.mLock.unlinkToDeath(wakeLock, 0);
removeWakeLockLocked(wakeLock, index);
}
@@ -1501,6 +1525,10 @@ public final class PowerManagerService extends SystemService
break;
case PowerManager.DRAW_WAKE_LOCK:
mWakeLockSummary |= WAKE_LOCK_DRAW;
case PowerManager.SUSTAINED_PERFORMANCE_WAKE_LOCK:
if (!wakeLock.mDisabled) {
mWakeLockSummary |= WAKE_LOCK_SUSTAINED_PERFORMANCE;
}
break;
}
}
@@ -2198,6 +2226,14 @@ public final class PowerManagerService extends SystemService
if (autoSuspend && mDecoupleHalAutoSuspendModeFromDisplayConfig) {
setHalAutoSuspendModeLocked(true);
}
if (mSustainedPerformanceMode
&& (mWakeLockSummary & WAKE_LOCK_SUSTAINED_PERFORMANCE) == 0) {
setSustainedPerformanceModeLocked(false);
} else if (!mSustainedPerformanceMode
&& (mWakeLockSummary & WAKE_LOCK_SUSTAINED_PERFORMANCE) != 0) {
setSustainedPerformanceModeLocked(true);
}
}
/**
@@ -2296,6 +2332,12 @@ public final class PowerManagerService extends SystemService
}
}
private void setSustainedPerformanceModeLocked(boolean mode) {
mSustainedPerformanceMode = mode;
powerHintInternal(POWER_HINT_SUSTAINED_PERFORMANCE,
mSustainedPerformanceMode ? 1 : 0);
}
boolean isDeviceIdleModeInternal() {
synchronized (mLock) {
return mDeviceIdleMode;
@@ -2425,7 +2467,7 @@ public final class PowerManagerService extends SystemService
void updateUidProcStateInternal(int uid, int procState) {
synchronized (mLock) {
mUidState.put(uid, procState);
if (mDeviceIdleMode) {
if (mDeviceIdleMode || mSustainedPerformanceUid.get(uid) != 0) {
updateWakeLockDisabledStatesLocked();
}
}
@@ -2446,7 +2488,9 @@ public final class PowerManagerService extends SystemService
for (int i = 0; i < numWakeLocks; i++) {
final WakeLock wakeLock = mWakeLocks.get(i);
if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.PARTIAL_WAKE_LOCK) {
== PowerManager.PARTIAL_WAKE_LOCK
|| (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.SUSTAINED_PERFORMANCE_WAKE_LOCK) {
if (setWakeLockDisabledStateLocked(wakeLock)) {
changed = true;
if (wakeLock.mDisabled) {
@@ -2465,9 +2509,9 @@ public final class PowerManagerService extends SystemService
}
private boolean setWakeLockDisabledStateLocked(WakeLock wakeLock) {
boolean disabled = false;
if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.PARTIAL_WAKE_LOCK) {
boolean disabled = false;
if (mDeviceIdleMode) {
final int appid = UserHandle.getAppId(wakeLock.mOwnerUid);
// If we are in idle mode, we will ignore all partial wake locks that are
@@ -2481,10 +2525,16 @@ public final class PowerManagerService extends SystemService
disabled = true;
}
}
if (wakeLock.mDisabled != disabled) {
wakeLock.mDisabled = disabled;
return true;
}
} else if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
== PowerManager.SUSTAINED_PERFORMANCE_WAKE_LOCK
&& mUidState.get(wakeLock.mOwnerUid,
ActivityManager.PROCESS_STATE_CACHED_EMPTY)
> ActivityManager.PROCESS_STATE_TOP) {
disabled = true;
}
if (wakeLock.mDisabled != disabled) {
wakeLock.mDisabled = disabled;
return true;
}
return false;
}
@@ -2695,6 +2745,7 @@ public final class PowerManagerService extends SystemService
pw.println(" mBatteryLevelLow=" + mBatteryLevelLow);
pw.println(" mLightDeviceIdleMode=" + mLightDeviceIdleMode);
pw.println(" mDeviceIdleMode=" + mDeviceIdleMode);
pw.println(" mSustainedPerformanceMode=" + mSustainedPerformanceMode);
pw.println(" mDeviceIdleWhitelist=" + Arrays.toString(mDeviceIdleWhitelist));
pw.println(" mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist));
pw.println(" mLastWakeTime=" + TimeUtils.formatUptime(mLastWakeTime));
@@ -2809,6 +2860,14 @@ public final class PowerManagerService extends SystemService
pw.println();
pw.println("Display Power: " + mDisplayPowerCallbacks);
pw.println();
pw.println("Sustained Performance UIDs:");
for (int i=0; i<mSustainedPerformanceUid.size(); i++) {
pw.print(" UID "); UserHandle.formatUid(pw, mSustainedPerformanceUid.keyAt(i));
pw.print(": "); pw.println(mSustainedPerformanceUid.valueAt(i));
}
wcd = mWirelessChargerDetector;
}