Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 383ec100 authored by riddle_hsu's avatar riddle_hsu Committed by Steve Kondik
Browse files

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
parent 481e72b9
Loading
Loading
Loading
Loading
+49 −41
Original line number Diff line number Diff line
@@ -175,6 +175,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;
@@ -1154,12 +1155,6 @@ public final class ActivityManagerService extends ActivityManagerNative
    final ArrayList<ProcessChangeItem> mAvailProcessChanges
            = new ArrayList<ProcessChangeItem>();
    /**
     * 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.
@@ -1301,6 +1296,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() {
@@ -1893,6 +1889,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()) {
@@ -2151,6 +2188,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);
@@ -2166,7 +2206,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.getActiveStatistics().writeAsyncLocked();
        mOnBattery = DEBUG_POWER ? true
@@ -2200,36 +2240,6 @@ public final class ActivityManagerService extends ActivityManagerNative
        mStackSupervisor = new ActivityStackSupervisor(this);
        mTaskPersister = new TaskPersister(systemDir, mStackSupervisor);
        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);
    }
@@ -2244,7 +2254,7 @@ public final class ActivityManagerService extends ActivityManagerNative
    private void start() {
        Process.removeAllProcessGroups();
        mProcessCpuThread.start();
        mCpuTrackerHandler.schedule();
        mBatteryStatsService.publish(mContext);
        mAppOpsService.publish(mContext);
@@ -2305,9 +2315,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            return;
        }
        if (mProcessCpuMutexFree.compareAndSet(true, false)) {
            synchronized (mProcessCpuThread) {
                mProcessCpuThread.notify();
            }
            mCpuTrackerHandler.updateNow();
        }
    }