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

Commit 3c8c3c61 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...

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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23705789



Change-Id: I1a70216678eeb9a8382c30c4aab26c3da284f4e2
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 14d881e1 5f9c92e0
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -17328,6 +17328,12 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
    }
    void onProcessFreezableChangedLocked(ProcessRecord app) {
        if (mEnableModernQueue) {
            mBroadcastQueues[0].onProcessFreezableChangedLocked(app);
        }
    }
    @VisibleForTesting
    public final class LocalService extends ActivityManagerInternal
            implements ActivityManagerLocal {
@@ -19039,6 +19045,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        // too quickly in parallel below
        pingCount.incrementAndGet();
        synchronized (ActivityManagerService.this) {
            synchronized (mProcLock) {
                final ArrayMap<String, SparseArray<ProcessRecord>> pmap =
                        mProcessList.getProcessNamesLOSP().getMap();
@@ -19063,6 +19070,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    }
                }
            }
        }
        // Now that we've dispatched all "ping" events above, we can send our
        // "pong" sentinel value
+12 −12
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ class BroadcastProcessQueue {
    private boolean mLastDeferredStates;

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

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

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

        boolean didSomething = false;
        if (app != null) {
            didSomething |= setUidCached(uidCached);
            didSomething |= setUidForeground(uidForeground);
            didSomething |= setProcessFreezable(processFreezable);
            didSomething |= setProcessInstrumented(app.getActiveInstrumentation() != null);
            didSomething |= setProcessPersistent(app.isPersistent());
        } else {
            didSomething |= setUidCached(uidCached);
            didSomething |= setUidForeground(false);
            didSomething |= setProcessFreezable(false);
            didSomething |= setProcessInstrumented(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.
     */
    @CheckResult
    private boolean setUidCached(boolean uidCached) {
        if (mUidCached != uidCached) {
            mUidCached = uidCached;
    private boolean setProcessFreezable(boolean freezable) {
        if (mProcessFreezable != freezable) {
            mProcessFreezable = freezable;
            invalidateRunnableAt();
            return true;
        } else {
@@ -1150,7 +1150,7 @@ class BroadcastProcessQueue {
            } else if (mCountManifest > 0) {
                mRunnableAt = runnableAt;
                mRunnableAtReason = REASON_CONTAINS_MANIFEST;
            } else if (mUidCached) {
            } else if (mProcessFreezable) {
                if (r.deferUntilActive) {
                    // All enqueued broadcasts are deferrable, defer
                    if (mCountDeferred == mCountEnqueued) {
@@ -1220,7 +1220,7 @@ class BroadcastProcessQueue {
        // When all we have pending is deferred broadcasts, and we're cached,
        // then we want everything to be marked deferred
        final boolean wantDeferredStates = (mCountDeferred > 0)
                && (mCountDeferred == mCountEnqueued) && mUidCached;
                && (mCountDeferred == mCountEnqueued) && mProcessFreezable;

        if (mLastDeferredStates != wantDeferredStates) {
            mLastDeferredStates = wantDeferredStates;
@@ -1407,9 +1407,9 @@ class BroadcastProcessQueue {
        if (mUidForeground) {
            sb.append("FG");
        }
        if (mUidCached) {
        if (mProcessFreezable) {
            if (sb.length() > 0) sb.append("|");
            sb.append("CACHED");
            sb.append("FRZ");
        }
        if (mProcessInstrumented) {
            if (sb.length() > 0) sb.append("|");
+7 −0
Original line number Diff line number Diff line
@@ -173,6 +173,13 @@ public abstract class BroadcastQueue {
    @GuardedBy("mService")
    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
     * package) has been disabled or uninstalled, and that any pending
+4 −0
Original line number Diff line number Diff line
@@ -466,6 +466,10 @@ public class BroadcastQueueImpl extends BroadcastQueue {
        skipCurrentOrPendingReceiverLocked(app);
    }

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

    public boolean sendPendingBroadcastsLocked(ProcessRecord app)
            throws BroadcastDeliveryFailedException {
        boolean didSomething = false;
+41 −38
Original line number Diff line number Diff line
@@ -232,16 +232,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    @GuardedBy("mService")
    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 mFgConstants;
    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_CHECK_HEALTH = 5;
    private static final int MSG_CHECK_PENDING_COLD_START_VALIDITY = 6;
    private static final int MSG_PROCESS_FREEZABLE_CHANGED = 7;

    private void enqueueUpdateRunningList() {
        mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST);
@@ -298,6 +289,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
                checkPendingColdStartValidity();
                return true;
            }
            case MSG_PROCESS_FREEZABLE_CHANGED: {
                synchronized (mService) {
                    refreshProcessQueueLocked((ProcessRecord) msg.obj);
                }
                return true;
            }
        }
        return false;
    };
@@ -672,6 +669,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        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
    public int getPreferredSchedulingGroupLocked(@NonNull ProcessRecord app) {
        final BroadcastProcessQueue queue = getProcessQueue(app);
@@ -1465,7 +1468,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            };
            broadcastPredicate = BROADCAST_PREDICATE_ANY;

            cleanupUserStateLocked(mUidCached, userId);
            cleanupUserStateLocked(mUidForeground, userId);
        }
        return forEachMatchingBroadcast(queuePredicate, broadcastPredicate,
@@ -1611,22 +1613,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        }, ActivityManager.UID_OBSERVER_PROCSTATE,
                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
        mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH);
    }
@@ -1816,10 +1802,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
            // warm via this operation, we're going to immediately promote it to
            // be running, and any side effect of this operation will then apply
            // after it's finished and is returned to the runnable list.
            queue.setProcessAndUidState(
                    mService.getProcessRecordLocked(queue.processName, queue.uid),
                    mUidForeground.get(queue.uid, false),
                    mUidCached.get(queue.uid, false));
            final ProcessRecord app = mService.getProcessRecordLocked(queue.processName, queue.uid);
            queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false),
                    isProcessFreezable(app));
        }
    }

@@ -1831,11 +1816,21 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    private void setQueueProcess(@NonNull BroadcastProcessQueue queue,
            @Nullable ProcessRecord app) {
        if (queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false),
                mUidCached.get(queue.uid, false))) {
                isProcessFreezable(app))) {
            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
     * can be updated.
@@ -1852,6 +1847,20 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        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
     * running, typically for internal bookkeeping.
@@ -2178,12 +2187,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        ipw.decreaseIndent();
        ipw.println();

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

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