summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java90
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();
}
}