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

Commit 06a3e2ca authored by Marco Ballesio's avatar Marco Ballesio
Browse files

freezer: don't allocate stats on unfreeze

Unfreeze operations could happen quite frequently. If they're
synchronous with ApplicationManager main thread they must also be
lightweight, so avoid any unnecessary allocations and reuse message
fields for log data.

Bug: 151187166
Test: installed on a flame and verified log messages are correct.
Change-Id: Ie5e22cdc5538277dbf19b5a5fffe505ca07a8083
parent a9219716
Loading
Loading
Loading
Loading
+22 −41
Original line number Diff line number Diff line
@@ -121,6 +121,7 @@ public final class CachedAppOptimizer {
    static final int COMPACT_PROCESS_MSG = 1;
    static final int COMPACT_SYSTEM_MSG = 2;
    static final int SET_FROZEN_PROCESS_MSG = 3;
    static final int REPORT_UNFREEZE_MSG = 4;

    //TODO:change this static definition into a configurable flag.
    static final int FREEZE_TIMEOUT_MS = 500;
@@ -613,30 +614,6 @@ public final class CachedAppOptimizer {
                FREEZE_TIMEOUT_MS);
    }

    private final class UnfreezeStats {
        final int mPid;
        final String mName;
        final long mFrozenDuration;

        UnfreezeStats(int pid, String name, long frozenDuration) {
            mPid = pid;
            mName = name;
            mFrozenDuration = frozenDuration;
        }

        public int getPid() {
            return mPid;
        }

        public String getName() {
            return mName;
        }

        public long getFrozenDuration() {
            return mFrozenDuration;
        }
    }

    @GuardedBy("mAm")
    void unfreezeAppLocked(ProcessRecord app) {
        mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);
@@ -667,12 +644,11 @@ public final class CachedAppOptimizer {
                Slog.d(TAG_AM, "sync unfroze " + app.pid + " " + app.processName);
            }

            UnfreezeStats stats = new UnfreezeStats(app.pid, app.processName,
                    app.freezeUnfreezeTime - freezeTime);

            mFreezeHandler.sendMessage(
                    mFreezeHandler.obtainMessage(SET_FROZEN_PROCESS_MSG, REPORT_UNFREEZE, 0,
                        stats));
                    mFreezeHandler.obtainMessage(REPORT_UNFREEZE_MSG,
                        app.pid,
                        (int) Math.min(app.freezeUnfreezeTime - freezeTime, Integer.MAX_VALUE),
                        app.processName));
        }
    }

@@ -945,14 +921,19 @@ public final class CachedAppOptimizer {

        @Override
        public void handleMessage(Message msg) {
            if (msg.what != SET_FROZEN_PROCESS_MSG) {
                return;
            }

            if (msg.arg1 == DO_FREEZE) {
            switch (msg.what) {
                case SET_FROZEN_PROCESS_MSG:
                    freezeProcess((ProcessRecord) msg.obj);
            } else if (msg.arg1 == REPORT_UNFREEZE) {
                reportUnfreeze((UnfreezeStats) msg.obj);
                    break;
                case REPORT_UNFREEZE_MSG:
                    int pid = msg.arg1;
                    int frozenDuration = msg.arg2;
                    String processName = (String) msg.obj;

                    reportUnfreeze(pid, frozenDuration, processName);
                    break;
                default:
                    return;
            }
        }

@@ -1015,18 +996,18 @@ public final class CachedAppOptimizer {
            }
        }

        private void reportUnfreeze(UnfreezeStats stats) {
        private void reportUnfreeze(int pid, int frozenDuration, String processName) {

            EventLog.writeEvent(EventLogTags.AM_UNFREEZE, stats.getPid(), stats.getName());
            EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName);

            // See above for why we're not taking mPhenotypeFlagLock here
            if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
                FrameworkStatsLog.write(
                        FrameworkStatsLog.APP_FREEZE_CHANGED,
                        FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
                        stats.getPid(),
                        stats.getName(),
                        stats.getFrozenDuration());
                        pid,
                        processName,
                        frozenDuration);
            }
        }
    }