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

Commit c847ecc8 authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Automerger Merge Worker
Browse files

Merge "Reland "Track per-process freezable state in BroadcastQueue."" into udc-dev am: 39ee2327

parents 6078f5fd 39ee2327
Loading
Loading
Loading
Loading
+27 −19
Original line number Original line Diff line number Diff line
@@ -17311,6 +17311,12 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
        }
    }
    }
    void onProcessFreezableChangedLocked(ProcessRecord app) {
        if (mEnableModernQueue) {
            mBroadcastQueues[0].onProcessFreezableChangedLocked(app);
        }
    }
    @VisibleForTesting
    @VisibleForTesting
    public final class LocalService extends ActivityManagerInternal
    public final class LocalService extends ActivityManagerInternal
            implements ActivityManagerLocal {
            implements ActivityManagerLocal {
@@ -19022,6 +19028,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        // too quickly in parallel below
        // too quickly in parallel below
        pingCount.incrementAndGet();
        pingCount.incrementAndGet();
        synchronized (ActivityManagerService.this) {
            synchronized (mProcLock) {
            synchronized (mProcLock) {
                final ArrayMap<String, SparseArray<ProcessRecord>> pmap =
                final ArrayMap<String, SparseArray<ProcessRecord>> pmap =
                        mProcessList.getProcessNamesLOSP().getMap();
                        mProcessList.getProcessNamesLOSP().getMap();
@@ -19046,6 +19053,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    }
                    }
                }
                }
            }
            }
        }
        // Now that we've dispatched all "ping" events above, we can send our
        // Now that we've dispatched all "ping" events above, we can send our
        // "pong" sentinel value
        // "pong" sentinel value
+12 −12
Original line number Original line Diff line number Diff line
@@ -208,7 +208,7 @@ class BroadcastProcessQueue {
    private boolean mLastDeferredStates;
    private boolean mLastDeferredStates;


    private boolean mUidForeground;
    private boolean mUidForeground;
    private boolean mUidCached;
    private boolean mProcessFreezable;
    private boolean mProcessInstrumented;
    private boolean mProcessInstrumented;
    private boolean mProcessPersistent;
    private boolean mProcessPersistent;


@@ -440,7 +440,7 @@ class BroadcastProcessQueue {
     */
     */
    @CheckResult
    @CheckResult
    public boolean setProcessAndUidState(@Nullable ProcessRecord app, boolean uidForeground,
    public boolean setProcessAndUidState(@Nullable ProcessRecord app, boolean uidForeground,
            boolean uidCached) {
            boolean processFreezable) {
        this.app = app;
        this.app = app;


        // Since we may have just changed our PID, invalidate cached strings
        // Since we may have just changed our PID, invalidate cached strings
@@ -449,13 +449,13 @@ class BroadcastProcessQueue {


        boolean didSomething = false;
        boolean didSomething = false;
        if (app != null) {
        if (app != null) {
            didSomething |= setUidCached(uidCached);
            didSomething |= setUidForeground(uidForeground);
            didSomething |= setUidForeground(uidForeground);
            didSomething |= setProcessFreezable(processFreezable);
            didSomething |= setProcessInstrumented(app.getActiveInstrumentation() != null);
            didSomething |= setProcessInstrumented(app.getActiveInstrumentation() != null);
            didSomething |= setProcessPersistent(app.isPersistent());
            didSomething |= setProcessPersistent(app.isPersistent());
        } else {
        } else {
            didSomething |= setUidCached(uidCached);
            didSomething |= setUidForeground(false);
            didSomething |= setUidForeground(false);
            didSomething |= setProcessFreezable(false);
            didSomething |= setProcessInstrumented(false);
            didSomething |= setProcessInstrumented(false);
            didSomething |= setProcessPersistent(false);
            didSomething |= setProcessPersistent(false);
        }
        }
@@ -479,13 +479,13 @@ class BroadcastProcessQueue {
    }
    }


    /**
    /**
     * Update if this process is in the "cached" state, typically signaling that
     * Update if this process is in the "freezable" state, typically signaling that
     * broadcast dispatch should be paused or delayed.
     * broadcast dispatch should be paused or delayed.
     */
     */
    @CheckResult
    @CheckResult
    private boolean setUidCached(boolean uidCached) {
    private boolean setProcessFreezable(boolean freezable) {
        if (mUidCached != uidCached) {
        if (mProcessFreezable != freezable) {
            mUidCached = uidCached;
            mProcessFreezable = freezable;
            invalidateRunnableAt();
            invalidateRunnableAt();
            return true;
            return true;
        } else {
        } else {
@@ -1150,7 +1150,7 @@ class BroadcastProcessQueue {
            } else if (mCountManifest > 0) {
            } else if (mCountManifest > 0) {
                mRunnableAt = runnableAt;
                mRunnableAt = runnableAt;
                mRunnableAtReason = REASON_CONTAINS_MANIFEST;
                mRunnableAtReason = REASON_CONTAINS_MANIFEST;
            } else if (mUidCached) {
            } else if (mProcessFreezable) {
                if (r.deferUntilActive) {
                if (r.deferUntilActive) {
                    // All enqueued broadcasts are deferrable, defer
                    // All enqueued broadcasts are deferrable, defer
                    if (mCountDeferred == mCountEnqueued) {
                    if (mCountDeferred == mCountEnqueued) {
@@ -1220,7 +1220,7 @@ class BroadcastProcessQueue {
        // When all we have pending is deferred broadcasts, and we're cached,
        // When all we have pending is deferred broadcasts, and we're cached,
        // then we want everything to be marked deferred
        // then we want everything to be marked deferred
        final boolean wantDeferredStates = (mCountDeferred > 0)
        final boolean wantDeferredStates = (mCountDeferred > 0)
                && (mCountDeferred == mCountEnqueued) && mUidCached;
                && (mCountDeferred == mCountEnqueued) && mProcessFreezable;


        if (mLastDeferredStates != wantDeferredStates) {
        if (mLastDeferredStates != wantDeferredStates) {
            mLastDeferredStates = wantDeferredStates;
            mLastDeferredStates = wantDeferredStates;
@@ -1407,9 +1407,9 @@ class BroadcastProcessQueue {
        if (mUidForeground) {
        if (mUidForeground) {
            sb.append("FG");
            sb.append("FG");
        }
        }
        if (mUidCached) {
        if (mProcessFreezable) {
            if (sb.length() > 0) sb.append("|");
            if (sb.length() > 0) sb.append("|");
            sb.append("CACHED");
            sb.append("FRZ");
        }
        }
        if (mProcessInstrumented) {
        if (mProcessInstrumented) {
            if (sb.length() > 0) sb.append("|");
            if (sb.length() > 0) sb.append("|");
+7 −0
Original line number Original line Diff line number Diff line
@@ -173,6 +173,13 @@ public abstract class BroadcastQueue {
    @GuardedBy("mService")
    @GuardedBy("mService")
    public abstract void onApplicationCleanupLocked(@NonNull ProcessRecord app);
    public abstract void onApplicationCleanupLocked(@NonNull ProcessRecord app);


    /**
     * Signal from OS internals that the given process is in a freezable state and will be
     * frozen soon after.
     */
    @GuardedBy("mService")
    public abstract void onProcessFreezableChangedLocked(@NonNull ProcessRecord app);

    /**
    /**
     * Signal from OS internals that the given package (or some subset of that
     * Signal from OS internals that the given package (or some subset of that
     * package) has been disabled or uninstalled, and that any pending
     * package) has been disabled or uninstalled, and that any pending
+4 −0
Original line number Original line Diff line number Diff line
@@ -466,6 +466,10 @@ public class BroadcastQueueImpl extends BroadcastQueue {
        skipCurrentOrPendingReceiverLocked(app);
        skipCurrentOrPendingReceiverLocked(app);
    }
    }


    public void onProcessFreezableChangedLocked(ProcessRecord app) {
        // Not supported; ignore
    }

    public boolean sendPendingBroadcastsLocked(ProcessRecord app)
    public boolean sendPendingBroadcastsLocked(ProcessRecord app)
            throws BroadcastDeliveryFailedException {
            throws BroadcastDeliveryFailedException {
        boolean didSomething = false;
        boolean didSomething = false;
+41 −38
Original line number Original line Diff line number Diff line
@@ -232,16 +232,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    @GuardedBy("mService")
    @GuardedBy("mService")
    private final SparseBooleanArray mUidForeground = new SparseBooleanArray();
    private final SparseBooleanArray mUidForeground = new SparseBooleanArray();


    /**
     * Map from UID to its last known "cached" state.
     * <p>
     * We manually maintain this data structure since the lifecycle of
     * {@link ProcessRecord} and {@link BroadcastProcessQueue} can be
     * mismatched.
     */
    @GuardedBy("mService")
    private final SparseBooleanArray mUidCached = new SparseBooleanArray();

    private final BroadcastConstants mConstants;
    private final BroadcastConstants mConstants;
    private final BroadcastConstants mFgConstants;
    private final BroadcastConstants mFgConstants;
    private final BroadcastConstants mBgConstants;
    private final BroadcastConstants mBgConstants;
@@ -258,6 +248,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    private static final int MSG_BG_ACTIVITY_START_TIMEOUT = 4;
    private static final int MSG_BG_ACTIVITY_START_TIMEOUT = 4;
    private static final int MSG_CHECK_HEALTH = 5;
    private static final int MSG_CHECK_HEALTH = 5;
    private static final int MSG_CHECK_PENDING_COLD_START_VALIDITY = 6;
    private static final int MSG_CHECK_PENDING_COLD_START_VALIDITY = 6;
    private static final int MSG_PROCESS_FREEZABLE_CHANGED = 7;


    private void enqueueUpdateRunningList() {
    private void enqueueUpdateRunningList() {
        mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST);
        mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST);
@@ -298,6 +289,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
                checkPendingColdStartValidity();
                checkPendingColdStartValidity();
                return true;
                return true;
            }
            }
            case MSG_PROCESS_FREEZABLE_CHANGED: {
                synchronized (mService) {
                    refreshProcessQueueLocked((ProcessRecord) msg.obj);
                }
                return true;
            }
        }
        }
        return false;
        return false;
    };
    };
@@ -672,6 +669,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        enqueueUpdateRunningList();
        enqueueUpdateRunningList();
    }
    }


    @Override
    public void onProcessFreezableChangedLocked(@NonNull ProcessRecord app) {
        mLocalHandler.removeMessages(MSG_PROCESS_FREEZABLE_CHANGED, app);
        mLocalHandler.sendMessage(mHandler.obtainMessage(MSG_PROCESS_FREEZABLE_CHANGED, app));
    }

    @Override
    @Override
    public int getPreferredSchedulingGroupLocked(@NonNull ProcessRecord app) {
    public int getPreferredSchedulingGroupLocked(@NonNull ProcessRecord app) {
        final BroadcastProcessQueue queue = getProcessQueue(app);
        final BroadcastProcessQueue queue = getProcessQueue(app);
@@ -1465,7 +1468,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            };
            };
            broadcastPredicate = BROADCAST_PREDICATE_ANY;
            broadcastPredicate = BROADCAST_PREDICATE_ANY;


            cleanupUserStateLocked(mUidCached, userId);
            cleanupUserStateLocked(mUidForeground, userId);
            cleanupUserStateLocked(mUidForeground, userId);
        }
        }
        return forEachMatchingBroadcast(queuePredicate, broadcastPredicate,
        return forEachMatchingBroadcast(queuePredicate, broadcastPredicate,
@@ -1611,22 +1613,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        }, ActivityManager.UID_OBSERVER_PROCSTATE,
        }, ActivityManager.UID_OBSERVER_PROCSTATE,
                ActivityManager.PROCESS_STATE_TOP, "android");
                ActivityManager.PROCESS_STATE_TOP, "android");


        mService.registerUidObserver(new UidObserver() {
            @Override
            public void onUidStateChanged(int uid, int procState, long procStateSeq,
                    int capability) {
                synchronized (mService) {
                    if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
                        mUidCached.put(uid, true);
                    } else {
                        mUidCached.delete(uid);
                    }
                    refreshProcessQueuesLocked(uid);
                }
            }
        }, ActivityManager.UID_OBSERVER_PROCSTATE,
                ActivityManager.PROCESS_STATE_LAST_ACTIVITY, "android");

        // Kick off periodic health checks
        // Kick off periodic health checks
        mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH);
        mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH);
    }
    }
@@ -1814,10 +1800,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            // warm via this operation, we're going to immediately promote it to
            // warm via this operation, we're going to immediately promote it to
            // be running, and any side effect of this operation will then apply
            // be running, and any side effect of this operation will then apply
            // after it's finished and is returned to the runnable list.
            // after it's finished and is returned to the runnable list.
            queue.setProcessAndUidState(
            final ProcessRecord app = mService.getProcessRecordLocked(queue.processName, queue.uid);
                    mService.getProcessRecordLocked(queue.processName, queue.uid),
            queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false),
                    mUidForeground.get(queue.uid, false),
                    isProcessFreezable(app));
                    mUidCached.get(queue.uid, false));
        }
        }
    }
    }


@@ -1829,11 +1814,21 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    private void setQueueProcess(@NonNull BroadcastProcessQueue queue,
    private void setQueueProcess(@NonNull BroadcastProcessQueue queue,
            @Nullable ProcessRecord app) {
            @Nullable ProcessRecord app) {
        if (queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false),
        if (queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false),
                mUidCached.get(queue.uid, false))) {
                isProcessFreezable(app))) {
            updateRunnableList(queue);
            updateRunnableList(queue);
        }
        }
    }
    }


    @GuardedBy("mService")
    private boolean isProcessFreezable(@Nullable ProcessRecord app) {
        if (app == null) {
            return false;
        }
        synchronized (mService.mProcLock) {
            return app.mOptRecord.isPendingFreeze() || app.mOptRecord.isFrozen();
        }
    }

    /**
    /**
     * Refresh the process queues with the latest process state so that runnableAt
     * Refresh the process queues with the latest process state so that runnableAt
     * can be updated.
     * can be updated.
@@ -1850,6 +1845,20 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        enqueueUpdateRunningList();
        enqueueUpdateRunningList();
    }
    }


    /**
     * Refresh the process queue corresponding to {@code app} with the latest process state
     * so that runnableAt can be updated.
     */
    @GuardedBy("mService")
    private void refreshProcessQueueLocked(@NonNull ProcessRecord app) {
        final BroadcastProcessQueue queue = getProcessQueue(app.processName, app.uid);
        if (queue == null || queue.app == null || queue.app.getPid() != app.getPid()) {
            return;
        }
        setQueueProcess(queue, queue.app);
        enqueueUpdateRunningList();
    }

    /**
    /**
     * Inform other parts of OS that the given broadcast queue has started
     * Inform other parts of OS that the given broadcast queue has started
     * running, typically for internal bookkeeping.
     * running, typically for internal bookkeeping.
@@ -2176,12 +2185,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        ipw.decreaseIndent();
        ipw.decreaseIndent();
        ipw.println();
        ipw.println();


        ipw.println("Cached UIDs:");
        ipw.increaseIndent();
        ipw.println(mUidCached);
        ipw.decreaseIndent();
        ipw.println();

        ipw.println("Foreground UIDs:");
        ipw.println("Foreground UIDs:");
        ipw.increaseIndent();
        ipw.increaseIndent();
        ipw.println(mUidForeground);
        ipw.println(mUidForeground);
Loading