diff options
-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(); } } |