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

Commit 9d44ecfe authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Fix ConnectivityController running job counting." into sc-dev am: 410e46c2

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

Change-Id: I104a49f5c29aa660062a7552b54c3e35f950b493
parents fe2b19b1 410e46c2
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -798,7 +798,8 @@ class JobConcurrencyManager {
    private void startJobLocked(@NonNull JobServiceContext worker, @NonNull JobStatus jobStatus,
    private void startJobLocked(@NonNull JobServiceContext worker, @NonNull JobStatus jobStatus,
            @WorkType final int workType) {
            @WorkType final int workType) {
        final List<StateController> controllers = mService.mControllers;
        final List<StateController> controllers = mService.mControllers;
        for (int ic = 0; ic < controllers.size(); ic++) {
        final int numControllers = controllers.size();
        for (int ic = 0; ic < numControllers; ic++) {
            controllers.get(ic).prepareForExecutionLocked(jobStatus);
            controllers.get(ic).prepareForExecutionLocked(jobStatus);
        }
        }
        final PackageStats packageStats =
        final PackageStats packageStats =
@@ -807,6 +808,9 @@ class JobConcurrencyManager {
        if (!worker.executeRunnableJob(jobStatus, workType)) {
        if (!worker.executeRunnableJob(jobStatus, workType)) {
            Slog.e(TAG, "Error executing " + jobStatus);
            Slog.e(TAG, "Error executing " + jobStatus);
            mWorkCountTracker.onStagedJobFailed(workType);
            mWorkCountTracker.onStagedJobFailed(workType);
            for (int ic = 0; ic < numControllers; ic++) {
                controllers.get(ic).unprepareFromExecutionLocked(jobStatus);
            }
        } else {
        } else {
            mRunningJobs.add(jobStatus);
            mRunningJobs.add(jobStatus);
            mWorkCountTracker.onJobStarted(workType);
            mWorkCountTracker.onJobStarted(workType);
+17 −10
Original line number Original line Diff line number Diff line
@@ -148,7 +148,8 @@ public final class ConnectivityController extends RestrictingController implemen
            //   9. Enqueue time
            //   9. Enqueue time
            // TODO: maybe consider number of jobs
            // TODO: maybe consider number of jobs
            // TODO: consider IMPORTANT_WHILE_FOREGROUND bit
            // TODO: consider IMPORTANT_WHILE_FOREGROUND bit
            final int runningPriority = prioritizeExistenceOver(0, us1.numRunning, us2.numRunning);
            final int runningPriority = prioritizeExistenceOver(0,
                    us1.runningJobs.size(), us2.runningJobs.size());
            if (runningPriority != 0) {
            if (runningPriority != 0) {
                return runningPriority;
                return runningPriority;
            }
            }
@@ -256,7 +257,18 @@ public final class ConnectivityController extends RestrictingController implemen
        if (jobStatus.hasConnectivityConstraint()) {
        if (jobStatus.hasConnectivityConstraint()) {
            final UidStats uidStats =
            final UidStats uidStats =
                    getUidStats(jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true);
                    getUidStats(jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true);
            uidStats.numRunning++;
            uidStats.runningJobs.add(jobStatus);
        }
    }

    @GuardedBy("mLock")
    @Override
    public void unprepareFromExecutionLocked(JobStatus jobStatus) {
        if (jobStatus.hasConnectivityConstraint()) {
            final UidStats uidStats =
                    getUidStats(jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true);
            uidStats.runningJobs.remove(jobStatus);
            postAdjustCallbacks();
        }
        }
    }
    }


@@ -272,12 +284,7 @@ public final class ConnectivityController extends RestrictingController implemen
            final UidStats uidStats =
            final UidStats uidStats =
                    getUidStats(jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true);
                    getUidStats(jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true);
            uidStats.numReadyWithConnectivity--;
            uidStats.numReadyWithConnectivity--;
            if (jobStatus.madeActive != 0) {
            uidStats.runningJobs.remove(jobStatus);
                // numRunning would be 0 if the UidStats object didn't exist before this method
                // was called. getUidStats() handles logging, so just make sure we don't save a
                // negative value.
                uidStats.numRunning = Math.max(0, uidStats.numRunning - 1);
            }
            maybeRevokeStandbyExceptionLocked(jobStatus);
            maybeRevokeStandbyExceptionLocked(jobStatus);
            postAdjustCallbacks();
            postAdjustCallbacks();
        }
        }
@@ -1151,7 +1158,7 @@ public final class ConnectivityController extends RestrictingController implemen
    private static class UidStats {
    private static class UidStats {
        public final int uid;
        public final int uid;
        public int basePriority;
        public int basePriority;
        public int numRunning;
        public final ArraySet<JobStatus> runningJobs = new ArraySet<>();
        public int numReadyWithConnectivity;
        public int numReadyWithConnectivity;
        public int numRequestedNetworkAvailable;
        public int numRequestedNetworkAvailable;
        public int numEJs;
        public int numEJs;
@@ -1168,7 +1175,7 @@ public final class ConnectivityController extends RestrictingController implemen
            pw.print("UidStats{");
            pw.print("UidStats{");
            pw.print("uid", uid);
            pw.print("uid", uid);
            pw.print("pri", basePriority);
            pw.print("pri", basePriority);
            pw.print("#run", numRunning);
            pw.print("#run", runningJobs.size());
            pw.print("#readyWithConn", numReadyWithConnectivity);
            pw.print("#readyWithConn", numReadyWithConnectivity);
            pw.print("#netAvail", numRequestedNetworkAvailable);
            pw.print("#netAvail", numRequestedNetworkAvailable);
            pw.print("#EJs", numEJs);
            pw.print("#EJs", numEJs);
+23 −0
Original line number Original line Diff line number Diff line
@@ -135,6 +135,29 @@ public final class ContentObserverController extends StateController {
        }
        }
    }
    }


    @Override
    public void unprepareFromExecutionLocked(JobStatus taskStatus) {
        if (taskStatus.hasContentTriggerConstraint()) {
            if (taskStatus.contentObserverJobInstance != null) {
                if (taskStatus.contentObserverJobInstance.mChangedUris == null) {
                    taskStatus.contentObserverJobInstance.mChangedUris = taskStatus.changedUris;
                } else {
                    taskStatus.contentObserverJobInstance.mChangedUris
                            .addAll(taskStatus.changedUris);
                }
                if (taskStatus.contentObserverJobInstance.mChangedAuthorities == null) {
                    taskStatus.contentObserverJobInstance.mChangedAuthorities =
                            taskStatus.changedAuthorities;
                } else {
                    taskStatus.contentObserverJobInstance.mChangedAuthorities
                            .addAll(taskStatus.changedAuthorities);
                }
                taskStatus.changedUris = null;
                taskStatus.changedAuthorities = null;
            }
        }
    }

    @Override
    @Override
    public void maybeStopTrackingJobLocked(JobStatus taskStatus, JobStatus incomingJob,
    public void maybeStopTrackingJobLocked(JobStatus taskStatus, JobStatus incomingJob,
            boolean forUpdate) {
            boolean forUpdate) {
+16 −14
Original line number Original line Diff line number Diff line
@@ -34,7 +34,6 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.IUidObserver;
import android.app.IUidObserver;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal;
@@ -677,27 +676,30 @@ public final class QuotaController extends StateController {
    }
    }


    @Override
    @Override
    public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob,
    public void unprepareFromExecutionLocked(JobStatus jobStatus) {
            boolean forUpdate) {
        Timer timer = mPkgTimers.get(jobStatus.getSourceUserId(), jobStatus.getSourcePackageName());
        if (jobStatus.clearTrackingController(JobStatus.TRACKING_QUOTA)) {
            Timer timer = mPkgTimers.get(jobStatus.getSourceUserId(),
                    jobStatus.getSourcePackageName());
        if (timer != null) {
        if (timer != null) {
            timer.stopTrackingJob(jobStatus);
            timer.stopTrackingJob(jobStatus);
        }
        }
        if (jobStatus.isRequestedExpeditedJob()) {
        if (jobStatus.isRequestedExpeditedJob()) {
                timer = mEJPkgTimers.get(jobStatus.getSourceUserId(),
            timer = mEJPkgTimers.get(jobStatus.getSourceUserId(), jobStatus.getSourcePackageName());
                        jobStatus.getSourcePackageName());
            if (timer != null) {
            if (timer != null) {
                timer.stopTrackingJob(jobStatus);
                timer.stopTrackingJob(jobStatus);
            }
            }
        }
        }
        mTopStartedJobs.remove(jobStatus);
    }

    @Override
    public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob,
            boolean forUpdate) {
        if (jobStatus.clearTrackingController(JobStatus.TRACKING_QUOTA)) {
            unprepareFromExecutionLocked(jobStatus);
            ArraySet<JobStatus> jobs = mTrackedJobs.get(jobStatus.getSourceUserId(),
            ArraySet<JobStatus> jobs = mTrackedJobs.get(jobStatus.getSourceUserId(),
                    jobStatus.getSourcePackageName());
                    jobStatus.getSourcePackageName());
            if (jobs != null) {
            if (jobs != null) {
                jobs.remove(jobStatus);
                jobs.remove(jobStatus);
            }
            }
            mTopStartedJobs.remove(jobStatus);
        }
        }
    }
    }


+6 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,12 @@ public abstract class StateController {
    public void prepareForExecutionLocked(JobStatus jobStatus) {
    public void prepareForExecutionLocked(JobStatus jobStatus) {
    }
    }


    /**
     * Optionally implement logic here for when a job that was about to be executed failed to start.
     */
    public void unprepareFromExecutionLocked(JobStatus jobStatus) {
    }

    /**
    /**
     * Remove task - this will happen if the task is cancelled, completed, etc.
     * Remove task - this will happen if the task is cancelled, completed, etc.
     */
     */