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

Commit 806f7768 authored by Shai Barack's avatar Shai Barack
Browse files

Use PriorityQueue for tracked Jobs

Previously this code kept an ordered list in a LinkedList.
Using PriorityQueue, with the element ordering as the priority, reduces code
complexity and also reduces runtime complexity (PQ ops are logN).

Randomly noticed this while looking at profiles of l3d cache refills in
system_server. This method was responsible for 0.815% of l3d cache refills.

Change-Id: I0c0bf358e68fef09c8ebcdbe8e5e53ef82cab387
parent 7d0f3c90
Loading
Loading
Loading
Loading
+15 −20
Original line number Diff line number Diff line
@@ -36,10 +36,9 @@ import com.android.server.AppSchedulingModuleThread;
import com.android.server.job.JobSchedulerService;
import com.android.server.job.StateControllerProto;

import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.PriorityQueue;
import java.util.function.Predicate;

/**
@@ -64,8 +63,17 @@ public final class TimeController extends StateController {
    private volatile long mLastFiredDelayExpiredElapsedMillis;

    private AlarmManager mAlarmService = null;
    /** List of tracked jobs, sorted asc. by deadline */
    private final List<JobStatus> mTrackedJobs = new LinkedList<>();

    /** List of tracked jobs, ordered by deadline (lowest i.e. earliest first) */
    private final PriorityQueue<JobStatus> mTrackedJobs =
            new PriorityQueue<>(
                    new Comparator<JobStatus>() {
                        public int compare(JobStatus left, JobStatus right) {
                            return Long.compare(
                                    left.getLatestRunTimeElapsed(),
                                    right.getLatestRunTimeElapsed());
                        }
                    });

    public TimeController(JobSchedulerService service) {
        super(service);
@@ -102,20 +110,7 @@ public final class TimeController extends StateController {
                }
            }

            boolean isInsert = false;
            ListIterator<JobStatus> it = mTrackedJobs.listIterator(mTrackedJobs.size());
            while (it.hasPrevious()) {
                JobStatus ts = it.previous();
                if (ts.getLatestRunTimeElapsed() < job.getLatestRunTimeElapsed()) {
                    // Insert
                    isInsert = true;
                    break;
                }
            }
            if (isInsert) {
                it.next();
            }
            it.add(job);
            mTrackedJobs.add(job);

            job.setTrackingController(JobStatus.TRACKING_TIME);
            WorkSource ws =
@@ -226,7 +221,7 @@ public final class TimeController extends StateController {
            String nextExpiryPackageName = null;
            final long nowElapsedMillis = sElapsedRealtimeClock.millis();

            ListIterator<JobStatus> it = mTrackedJobs.listIterator();
            Iterator<JobStatus> it = mTrackedJobs.iterator();
            while (it.hasNext()) {
                JobStatus job = it.next();
                if (!job.hasDeadlineConstraint()) {