From e96440fa15b9158690996dd1e5ef2096099d5388 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Wed, 6 May 2009 10:27:36 -0700 Subject: [PATCH] AI 148368: Decrease CPU usage by throttling touch events We are decreasing CPU usage at the cost of event latency. Events are queued up and released to the app at the specified rate. You can experiment with different values via: adb shell setprop windowsmgr.max_events_per_sec 35 The new value is picked up when you let go and retouch the screen. No reboot needed. Also the following changes were made after profiling: - In WindowManagerService, limit the call to userActivity() when we have a flood touch events. - In PowerManagerService, skip checking of permission if the caller is system user. - In PowerManagerService, integrated the functionality of gatherState() into reactivateWakeLocksLocked(). They loop through the same data structure and are called back to back. BUG=1692771 Automated import of CL 148368 --- .../android/server/PowerManagerService.java | 47 ++++++----- .../android/server/WindowManagerService.java | 84 +++++++++++++++++-- 2 files changed, 103 insertions(+), 28 deletions(-) diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 9c6e9dcd68970..c5ea5fa9652c8 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -496,8 +496,10 @@ class PowerManagerService extends IPowerManager.Stub implements LocalPowerManage } public void acquireWakeLock(int flags, IBinder lock, String tag) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); int uid = Binder.getCallingUid(); + if (uid != Process.myUid()) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); + } long ident = Binder.clearCallingIdentity(); try { synchronized (mLocks) { @@ -554,14 +556,14 @@ class PowerManagerService extends IPowerManager.Stub implements LocalPowerManage // by the current state so we never turn it more on than // it already is. if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) { - reactivateWakeLocksLocked(); + int oldWakeLockState = mWakeLockState; + mWakeLockState = mLocks.reactivateScreenLocksLocked(); if (mSpew) { Log.d(TAG, "wakeup here mUserState=0x" + Integer.toHexString(mUserState) - + " mLocks.gatherState()=0x" - + Integer.toHexString(mLocks.gatherState()) - + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState)); + + " mWakeLockState=0x" + + Integer.toHexString(mWakeLockState) + + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState)); } - mWakeLockState = mLocks.gatherState(); } else { if (mSpew) { Log.d(TAG, "here mUserState=0x" + Integer.toHexString(mUserState) @@ -598,7 +600,10 @@ class PowerManagerService extends IPowerManager.Stub implements LocalPowerManage } public void releaseWakeLock(IBinder lock) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); + int uid = Binder.getCallingUid(); + if (uid != Process.myUid()) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); + } synchronized (mLocks) { releaseWakeLockLocked(lock, false); @@ -653,17 +658,6 @@ class PowerManagerService extends IPowerManager.Stub implements LocalPowerManage } } - private void reactivateWakeLocksLocked() - { - int N = mLocks.size(); - for (int i=0; i= MIN_TIME_BETWEEN_USERACTIVITIES) { + mLastBatteryStatsCallTime = now; + mBatteryStats.noteInputEvent(); + } } catch (RemoteException e) { // Ignore } - mPowerManager.userActivity(curTime, false, eventType); + mPowerManager.userActivity(curTime, false, eventType, false); switch (ev.classType) { case RawInputEvent.CLASS_KEYBOARD: KeyEvent ke = (KeyEvent)ev.event;