From 96327542741f6fb350134275cb2c55a9d3bfb179 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Sat, 16 Apr 2022 19:32:51 +0100 Subject: [PATCH] Ensure task is added to queue before queue is checked. --- .../bramble/system/AndroidTaskScheduler.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidTaskScheduler.java b/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidTaskScheduler.java index 639824991..fd0a89c13 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidTaskScheduler.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidTaskScheduler.java @@ -116,10 +116,12 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener { long dueMillis = now + MILLISECONDS.convert(delay, unit); Runnable wakeful = () -> wakeLockManager.executeWakefully(task, executor, "TaskHandoff"); - Future check = scheduleCheckForDueTasks(delay, unit); - ScheduledTask s = new ScheduledTask(wakeful, dueMillis, check, - cancelled); + // Acquire the lock before scheduling the check to ensure the check + // doesn't access the task queue before the task has been added + ScheduledTask s; synchronized (lock) { + Future check = scheduleCheckForDueTasks(delay, unit); + s = new ScheduledTask(wakeful, dueMillis, check, cancelled); tasks.add(s); } return s; @@ -136,6 +138,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener { return schedule(wrapped, executor, delay, unit, cancelled); } + @GuardedBy("lock") private Future scheduleCheckForDueTasks(long delay, TimeUnit unit) { Runnable wakeful = () -> wakeLockManager.runWakefully( this::runDueTasks, "TaskScheduler"); @@ -206,7 +209,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener { private final Future check; private final AtomicBoolean cancelled; - public ScheduledTask(Runnable task, long dueMillis, + private ScheduledTask(Runnable task, long dueMillis, Future check, AtomicBoolean cancelled) { this.task = task; this.dueMillis = dueMillis;