mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-23 18:30:20 +01:00
Some additional decryption perf improvements.
This commit is contained in:
@@ -156,6 +156,41 @@ class JobController {
|
||||
}
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
void submitJobs(@NonNull List<Job> jobs) {
|
||||
List<Job> canRun = new ArrayList<>(jobs.size());
|
||||
|
||||
synchronized (this) {
|
||||
for (Job job : jobs) {
|
||||
if (exceedsMaximumInstances(job)) {
|
||||
jobTracker.onStateChange(job, JobTracker.JobState.IGNORED);
|
||||
Log.w(TAG, JobLogger.format(job, "Already at the max instance count. Factory limit: " + job.getParameters().getMaxInstancesForFactory() + ", Queue limit: " + job.getParameters().getMaxInstancesForQueue() + ". Skipping."));
|
||||
} else {
|
||||
canRun.add(job);
|
||||
}
|
||||
}
|
||||
|
||||
if (canRun.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<FullSpec> fullSpecs = canRun.stream().map(it -> buildFullSpec(it, Collections.emptyList())).collect(java.util.stream.Collectors.toList());
|
||||
jobStorage.insertJobs(fullSpecs);
|
||||
|
||||
scheduleJobs(canRun);
|
||||
}
|
||||
|
||||
// We have no control over what happens in jobs' onSubmit method, so we drop our lock to reduce the possibility of a deadlock
|
||||
for (Job job : canRun) {
|
||||
job.setContext(application);
|
||||
job.onSubmit();
|
||||
}
|
||||
|
||||
synchronized (this) {
|
||||
notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
synchronized void cancelJob(@NonNull String id) {
|
||||
Job runningJob = runningJobs.get(id);
|
||||
@@ -359,25 +394,26 @@ class JobController {
|
||||
@WorkerThread
|
||||
private boolean chainExceedsMaximumInstances(@NonNull List<List<Job>> chain) {
|
||||
if (chain.size() == 1 && chain.get(0).size() == 1) {
|
||||
Job solo = chain.get(0).get(0);
|
||||
return exceedsMaximumInstances(chain.get(0).get(0));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
boolean exceedsFactory = solo.getParameters().getMaxInstancesForFactory() != Job.Parameters.UNLIMITED &&
|
||||
jobStorage.getJobCountForFactory(solo.getFactoryKey()) >= solo.getParameters().getMaxInstancesForFactory();
|
||||
@WorkerThread
|
||||
private boolean exceedsMaximumInstances(@NonNull Job job) {
|
||||
boolean exceedsFactory = job.getParameters().getMaxInstancesForFactory() != Job.Parameters.UNLIMITED &&
|
||||
jobStorage.getJobCountForFactory(job.getFactoryKey()) >= job.getParameters().getMaxInstancesForFactory();
|
||||
|
||||
if (exceedsFactory) {
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean exceedsQueue = solo.getParameters().getQueue() != null &&
|
||||
solo.getParameters().getMaxInstancesForQueue() != Job.Parameters.UNLIMITED &&
|
||||
jobStorage.getJobCountForFactoryAndQueue(solo.getFactoryKey(), solo.getParameters().getQueue()) >= solo.getParameters().getMaxInstancesForQueue();
|
||||
|
||||
if (exceedsQueue) {
|
||||
return true;
|
||||
}
|
||||
if (exceedsFactory) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
boolean exceedsQueue = job.getParameters().getQueue() != null &&
|
||||
job.getParameters().getMaxInstancesForQueue() != Job.Parameters.UNLIMITED &&
|
||||
jobStorage.getJobCountForFactoryAndQueue(job.getFactoryKey(), job.getParameters().getQueue()) >= job.getParameters().getMaxInstancesForQueue();
|
||||
|
||||
return exceedsQueue;
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
package org.thoughtcrime.securesms.jobmanager;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class JobLogger {
|
||||
|
||||
public static String format(@NonNull Job job, @NonNull String event) {
|
||||
return format(job, "", event);
|
||||
}
|
||||
|
||||
public static String format(@NonNull Job job, @NonNull String extraTag, @NonNull String event) {
|
||||
String id = job.getId();
|
||||
String tag = TextUtils.isEmpty(extraTag) ? "" : "[" + extraTag + "]";
|
||||
long timeSinceSubmission = System.currentTimeMillis() - job.getParameters().getCreateTime();
|
||||
int runAttempt = job.getRunAttempt() + 1;
|
||||
String maxAttempts = job.getParameters().getMaxAttempts() == Job.Parameters.UNLIMITED ? "Unlimited"
|
||||
: String.valueOf(job.getParameters().getMaxAttempts());
|
||||
String lifespan = job.getParameters().getLifespan() == Job.Parameters.IMMORTAL ? "Immortal"
|
||||
: String.valueOf(job.getParameters().getLifespan()) + " ms";
|
||||
return String.format(Locale.US,
|
||||
"[%s][%s]%s %s (Time Since Submission: %d ms, Lifespan: %s, Run Attempt: %d/%s, Queue: %s)",
|
||||
"JOB::" + id, job.getClass().getSimpleName(), tag, event, timeSinceSubmission, lifespan, runAttempt, maxAttempts, job.getParameters().getQueue());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package org.thoughtcrime.securesms.jobmanager
|
||||
|
||||
import android.text.TextUtils
|
||||
|
||||
/**
|
||||
* Provides utilities to create consistent logging for jobs.
|
||||
*/
|
||||
object JobLogger {
|
||||
|
||||
@JvmStatic
|
||||
fun format(job: Job, event: String): String {
|
||||
return format(job, "", event)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun format(job: Job, extraTag: String, event: String): String {
|
||||
val id = job.id
|
||||
val tag = if (TextUtils.isEmpty(extraTag)) "" else "[$extraTag]"
|
||||
val timeSinceSubmission = System.currentTimeMillis() - job.parameters.createTime
|
||||
val runAttempt = job.runAttempt + 1
|
||||
val maxAttempts = if (job.parameters.maxAttempts == Job.Parameters.UNLIMITED) "Unlimited" else job.parameters.maxAttempts.toString()
|
||||
val lifespan = if (job.parameters.lifespan == Job.Parameters.IMMORTAL) "Immortal" else job.parameters.lifespan.toString() + " ms"
|
||||
|
||||
return "[JOB::$id][${job.javaClass.simpleName}]$tag $event (Time Since Submission: $timeSinceSubmission ms, Lifespan: $lifespan, Run Attempt: $runAttempt/$maxAttempts, Queue: ${job.parameters.queue})"
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,6 @@ import androidx.annotation.WorkerThread;
|
||||
|
||||
import org.signal.core.util.ThreadUtil;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.jobmanager.impl.DefaultExecutorFactory;
|
||||
import org.thoughtcrime.securesms.jobmanager.impl.JsonDataSerializer;
|
||||
import org.thoughtcrime.securesms.jobmanager.persistence.JobSpec;
|
||||
@@ -177,7 +176,6 @@ public class JobManager implements ConstraintObserver.Notifier {
|
||||
|
||||
runOnExecutor(() -> {
|
||||
jobController.submitJobWithExistingDependencies(job, Collections.emptyList(), dependsOnQueue);
|
||||
jobController.wakeUp();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -190,7 +188,20 @@ public class JobManager implements ConstraintObserver.Notifier {
|
||||
|
||||
runOnExecutor(() -> {
|
||||
jobController.submitJobWithExistingDependencies(job, dependsOn, dependsOnQueue);
|
||||
jobController.wakeUp();
|
||||
});
|
||||
}
|
||||
|
||||
public void addAll(@NonNull List<Job> jobs) {
|
||||
if (jobs.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Job job : jobs) {
|
||||
jobTracker.onStateChange(job, JobTracker.JobState.PENDING);
|
||||
}
|
||||
|
||||
runOnExecutor(() -> {
|
||||
jobController.submitJobs(jobs);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user