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

Commit fa7afb2d authored by Hui Yu's avatar Hui Yu Committed by Android (Google) Code Review
Browse files

Merge "The uid with the newest timestamp in mPendingStartActivityUids gets the best score."

parents cc2ca4ba 64a4c4ec
Loading
Loading
Loading
Loading
+27 −6
Original line number Diff line number Diff line
@@ -5615,15 +5615,29 @@ public class ActivityManagerService extends IActivityManager.Stub
        synchronized (mProcLock) {
            synchronized (mPidsSelfLocked) {
                int newestTimeIndex = -1;
                long newestTime = Long.MIN_VALUE;
                for (int i = 0; i < pids.length; i++) {
                    ProcessRecord pr = mPidsSelfLocked.get(pids[i]);
                    if (pr != null) {
                        final boolean isPendingTop =
                                mPendingStartActivityUids.isPendingTopPid(pr.uid, pids[i]);
                        states[i] = isPendingTop ? PROCESS_STATE_TOP : pr.mState.getCurProcState();
                        final long pendingTopTime =
                                mPendingStartActivityUids.getPendingTopPidTime(pr.uid, pids[i]);
                        if (pendingTopTime != PendingStartActivityUids.INVALID_TIME) {
                            // The uid in mPendingStartActivityUids gets the TOP process state.
                            states[i] = PROCESS_STATE_TOP;
                            if (scores != null) {
                            scores[i] = isPendingTop
                                    ? (ProcessList.FOREGROUND_APP_ADJ - 1) : pr.mState.getCurAdj();
                                // The uid in mPendingStartActivityUids gets a better score.
                                scores[i] = ProcessList.FOREGROUND_APP_ADJ - 1;
                            }
                            if (pendingTopTime > newestTime) {
                                newestTimeIndex = i;
                                newestTime = pendingTopTime;
                            }
                        } else {
                            states[i] = pr.mState.getCurProcState();
                            if (scores != null) {
                                scores[i] = pr.mState.getCurAdj();
                            }
                        }
                    } else {
                        states[i] = PROCESS_STATE_NONEXISTENT;
@@ -5632,6 +5646,13 @@ public class ActivityManagerService extends IActivityManager.Stub
                        }
                    }
                }
                // The uid with the newest timestamp in mPendingStartActivityUids gets the best
                // score.
                if (newestTimeIndex != -1) {
                    if (scores != null) {
                        scores[newestTimeIndex] = ProcessList.FOREGROUND_APP_ADJ - 2;
                    }
                }
            }
        }
    }
+14 −5
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ import android.util.SparseArray;
final class PendingStartActivityUids {
    static final String TAG = ActivityManagerService.TAG;

    public static final long INVALID_TIME = 0;

    // Key is uid, value is Pair of pid and SystemClock.elapsedRealtime() when the
    // uid is added.
    private final SparseArray<Pair<Integer, Long>> mPendingUids = new SparseArray();
@@ -63,13 +65,20 @@ final class PendingStartActivityUids {
        }
    }

    synchronized boolean isPendingTopPid(int uid, int pid) {
    /**
     * Return the elapsedRealtime when the uid is added to the mPendingUids map.
     * @param uid
     * @param pid
     * @return elapsedRealtime if the uid is in the mPendingUids map;
     *         INVALID_TIME if the uid is not in the mPendingUids map.
     */
    synchronized long getPendingTopPidTime(int uid, int pid) {
        long ret = INVALID_TIME;
        final Pair<Integer, Long> pendingPid = mPendingUids.get(uid);
        if (pendingPid != null) {
            return pendingPid.first == pid;
        } else {
            return false;
        if (pendingPid != null && pendingPid.first == pid) {
            ret = pendingPid.second;
        }
        return ret;
    }

    synchronized boolean isPendingTopUid(int uid) {