diff options
author | riddle_hsu <riddle_hsu@htc.com> | 2015-05-27 02:32:59 +0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-10-27 15:11:38 -0700 |
commit | 3cc9426ded3f1668c711f1d095a9535afc157975 (patch) | |
tree | a8e8b5d0001b8771d2c4e84ab771422373d1ebc6 /services | |
parent | 6ff3ff5bfc5bd26474368be8295749db494b71e0 (diff) | |
download | frameworks_base-3cc9426ded3f1668c711f1d095a9535afc157975.zip frameworks_base-3cc9426ded3f1668c711f1d095a9535afc157975.tar.gz frameworks_base-3cc9426ded3f1668c711f1d095a9535afc157975.tar.bz2 |
Run BatteryCallback on CpuTracker thread.
Because ProcessCpuTracker may take some time to read proc
stats, to have better response time of ActivityManager
(e.g. schedule broadcast), let callbacks batteryNeedsCpuUpdate
and batteryPowerChanged run on CpuTracker thread by using
CpuTrackerHandler for BatteryStatsImpl.
Change-Id: Ie088ded8b2c6834e913c30f560b490075a7a6dbe
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 90 |
1 files changed, 49 insertions, 41 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9da1a95..0ce09ab 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -198,6 +198,7 @@ import android.os.FactoryTest; import android.os.FileObserver; import android.os.FileUtils; import android.os.Handler; +import android.os.HandlerThread; import android.os.IBinder; import android.os.IPermissionController; import android.os.IProcessInfoService; @@ -1246,12 +1247,6 @@ public final class ActivityManagerService extends ActivityManagerNative final ArrayList<UidRecord.ChangeItem> mAvailUidChanges = new ArrayList<>(); /** - * Runtime CPU use collection thread. This object's lock is used to - * perform synchronization with the thread (notifying it to run). - */ - final Thread mProcessCpuThread; - - /** * Used to collect per-process CPU use for ANRs, battery stats, etc. * Must acquire this object's lock when accessing it. * NOTE: this lock will be held while doing long operations (trawling @@ -1407,6 +1402,7 @@ public final class ActivityManagerService extends ActivityManagerNative final ServiceThread mHandlerThread; final MainHandler mHandler; final UiHandler mUiHandler; + final CpuTrackerHandler mCpuTrackerHandler; final class UiHandler extends Handler { public UiHandler() { @@ -2061,6 +2057,47 @@ public final class ActivityManagerService extends ActivityManagerNative } }; + static final int SCHEDULE_CPU_STATS_MSG = 1; + static final int UPDATE_CPU_STATS_MSG = 2; + + final class CpuTrackerHandler extends Handler { + public CpuTrackerHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case SCHEDULE_CPU_STATS_MSG: { + final long now = SystemClock.uptimeMillis(); + long nextCpuDelay = (mLastCpuTime.get() + MONITOR_CPU_MAX_TIME) - now; + long nextWriteDelay = (mLastWriteTime + BATTERY_STATS_TIME) - now; + //Slog.i(TAG, "Cpu delay=" + nextCpuDelay + ", write delay=" + nextWriteDelay); + if (nextWriteDelay < nextCpuDelay) { + nextCpuDelay = nextWriteDelay; + } + if (nextCpuDelay > 0) { + mProcessCpuMutexFree.set(true); + sendEmptyMessageDelayed(UPDATE_CPU_STATS_MSG, nextCpuDelay); + } + } break; + case UPDATE_CPU_STATS_MSG: { + updateCpuStatsNow(); + schedule(); + } break; + } + } + + void schedule() { + sendEmptyMessage(SCHEDULE_CPU_STATS_MSG); + } + + void updateNow() { + removeMessages(UPDATE_CPU_STATS_MSG); + sendEmptyMessage(UPDATE_CPU_STATS_MSG); + } + } + static final int COLLECT_PSS_BG_MSG = 1; final Handler mBgHandler = new Handler(BackgroundThread.getHandler().getLooper()) { @@ -2324,6 +2361,9 @@ public final class ActivityManagerService extends ActivityManagerNative mHandlerThread.start(); mHandler = new MainHandler(mHandlerThread.getLooper()); mUiHandler = new UiHandler(); + HandlerThread cpuTrackerThread = new HandlerThread("CpuTracker"); + cpuTrackerThread.start(); + mCpuTrackerHandler = new CpuTrackerHandler(cpuTrackerThread.getLooper()); mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", BROADCAST_FG_TIMEOUT, false); @@ -2339,7 +2379,7 @@ public final class ActivityManagerService extends ActivityManagerNative File dataDir = Environment.getDataDirectory(); File systemDir = new File(dataDir, "system"); systemDir.mkdirs(); - mBatteryStatsService = new BatteryStatsService(systemDir, mHandler); + mBatteryStatsService = new BatteryStatsService(systemDir, mCpuTrackerHandler); mBatteryStatsService.getActiveStatistics().readLocked(); mBatteryStatsService.scheduleWriteToDisk(); mOnBattery = DEBUG_POWER ? true @@ -2374,36 +2414,6 @@ public final class ActivityManagerService extends ActivityManagerNative mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks); mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks); - mProcessCpuThread = new Thread("CpuTracker") { - @Override - public void run() { - while (true) { - try { - try { - synchronized(this) { - final long now = SystemClock.uptimeMillis(); - long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now; - long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now; - //Slog.i(TAG, "Cpu delay=" + nextCpuDelay - // + ", write delay=" + nextWriteDelay); - if (nextWriteDelay < nextCpuDelay) { - nextCpuDelay = nextWriteDelay; - } - if (nextCpuDelay > 0) { - mProcessCpuMutexFree.set(true); - this.wait(nextCpuDelay); - } - } - } catch (InterruptedException e) { - } - updateCpuStatsNow(); - } catch (Exception e) { - Slog.e(TAG, "Unexpected exception collecting process stats", e); - } - } - } - }; - Watchdog.getInstance().addMonitor(this); Watchdog.getInstance().addThread(mHandler); } @@ -2418,7 +2428,7 @@ public final class ActivityManagerService extends ActivityManagerNative private void start() { Process.removeAllProcessGroups(); - mProcessCpuThread.start(); + mCpuTrackerHandler.schedule(); mBatteryStatsService.publish(mContext); mAppOpsService.publish(mContext); @@ -2483,9 +2493,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } if (mProcessCpuMutexFree.compareAndSet(true, false)) { - synchronized (mProcessCpuThread) { - mProcessCpuThread.notify(); - } + mCpuTrackerHandler.updateNow(); } } |