Pass executor to scheduler.

This commit is contained in:
akwizgran
2020-08-06 13:11:12 +01:00
parent d5395d3d01
commit 3aa00ecb3d
14 changed files with 128 additions and 92 deletions

View File

@@ -9,6 +9,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.lifecycle.Service;
import org.briarproject.bramble.api.network.NetworkManager;
import org.briarproject.bramble.api.network.NetworkStatus;
@@ -17,6 +18,7 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.system.TaskScheduler;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -51,6 +53,7 @@ class AndroidNetworkManager implements NetworkManager, Service {
private final TaskScheduler scheduler;
private final EventBus eventBus;
private final Executor eventExecutor;
private final Context appContext;
private final AtomicReference<Future<?>> connectivityCheck =
new AtomicReference<>();
@@ -60,9 +63,10 @@ class AndroidNetworkManager implements NetworkManager, Service {
@Inject
AndroidNetworkManager(TaskScheduler scheduler, EventBus eventBus,
Application app) {
@EventExecutor Executor eventExecutor, Application app) {
this.scheduler = scheduler;
this.eventBus = eventBus;
this.eventExecutor = eventExecutor;
this.appContext = app.getApplicationContext();
}
@@ -104,7 +108,8 @@ class AndroidNetworkManager implements NetworkManager, Service {
private void scheduleConnectionStatusUpdate(int delay, TimeUnit unit) {
Future<?> newConnectivityCheck =
scheduler.schedule(this::updateConnectionStatus, delay, unit);
scheduler.schedule(this::updateConnectionStatus, eventExecutor,
delay, unit);
Future<?> oldConnectivityCheck =
connectivityCheck.getAndSet(newConnectivityCheck);
if (oldConnectivityCheck != null) oldConnectivityCheck.cancel(false);

View File

@@ -17,6 +17,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledExecutorService;
@@ -78,10 +79,11 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
}
@Override
public Future<?> schedule(Runnable task, long delay, TimeUnit unit) {
public Future<?> schedule(Runnable task, Executor executor, long delay,
TimeUnit unit) {
long now = SystemClock.elapsedRealtime();
long dueMillis = now + MILLISECONDS.convert(delay, unit);
ScheduledTask s = new ScheduledTask(task, dueMillis);
ScheduledTask s = new ScheduledTask(task, executor, dueMillis);
if (dueMillis <= now) {
scheduledExecutorService.execute(s);
} else {
@@ -93,13 +95,13 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
}
@Override
public Future<?> scheduleWithFixedDelay(Runnable task, long delay,
long interval, TimeUnit unit) {
public Future<?> scheduleWithFixedDelay(Runnable task, Executor executor,
long delay, long interval, TimeUnit unit) {
Runnable wrapped = () -> {
task.run();
scheduleWithFixedDelay(task, interval, interval, unit);
scheduleWithFixedDelay(task, executor, interval, interval, unit);
};
return schedule(wrapped, delay, unit);
return schedule(wrapped, executor, delay, unit);
}
@Override
@@ -175,8 +177,9 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
private final long dueMillis;
public ScheduledTask(Runnable runnable, long dueMillis) {
super(runnable, null);
public ScheduledTask(Runnable runnable, Executor executor,
long dueMillis) {
super(() -> executor.execute(runnable), null);
this.dueMillis = dueMillis;
}

View File

@@ -6,11 +6,14 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.PowerManager;
import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AndroidWakeLock;
import org.briarproject.bramble.api.system.AndroidWakeLockFactory;
import org.briarproject.bramble.api.system.TaskScheduler;
import java.util.concurrent.Executor;
import javax.annotation.concurrent.Immutable;
import javax.inject.Inject;
@@ -38,12 +41,15 @@ class AndroidWakeLockFactoryImpl implements AndroidWakeLockFactory {
private final SharedWakeLock sharedWakeLock;
@Inject
AndroidWakeLockFactoryImpl(TaskScheduler scheduler, Application app) {
AndroidWakeLockFactoryImpl(TaskScheduler scheduler,
@EventExecutor Executor eventExecutor,
Application app) {
PowerManager powerManager = (PowerManager)
requireNonNull(app.getSystemService(POWER_SERVICE));
String tag = getWakeLockTag(app);
sharedWakeLock = new RenewableWakeLock(powerManager, scheduler,
PARTIAL_WAKE_LOCK, tag, LOCK_DURATION_MS, SAFETY_MARGIN_MS);
eventExecutor, PARTIAL_WAKE_LOCK, tag, LOCK_DURATION_MS,
SAFETY_MARGIN_MS);
}
@Override

View File

@@ -6,6 +6,7 @@ import android.os.PowerManager.WakeLock;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.TaskScheduler;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.logging.Logger;
@@ -28,6 +29,7 @@ class RenewableWakeLock implements SharedWakeLock {
private final PowerManager powerManager;
private final TaskScheduler scheduler;
private final Executor eventExecutor;
private final int levelAndFlags;
private final String tag;
private final long durationMs, safetyMarginMs;
@@ -44,11 +46,16 @@ class RenewableWakeLock implements SharedWakeLock {
@GuardedBy("lock")
private long acquired = 0;
RenewableWakeLock(PowerManager powerManager, TaskScheduler scheduler,
int levelAndFlags, String tag, long durationMs,
RenewableWakeLock(PowerManager powerManager,
TaskScheduler scheduler,
Executor eventExecutor,
int levelAndFlags,
String tag,
long durationMs,
long safetyMarginMs) {
this.powerManager = powerManager;
this.scheduler = scheduler;
this.eventExecutor = eventExecutor;
this.levelAndFlags = levelAndFlags;
this.tag = tag;
this.durationMs = durationMs;
@@ -69,8 +76,8 @@ class RenewableWakeLock implements SharedWakeLock {
// power management apps
wakeLock.setReferenceCounted(false);
wakeLock.acquire(durationMs + safetyMarginMs);
future = scheduler.schedule(this::renew, durationMs,
MILLISECONDS);
future = scheduler.schedule(this::renew, eventExecutor,
durationMs, MILLISECONDS);
acquired = android.os.SystemClock.elapsedRealtime();
}
}
@@ -93,7 +100,8 @@ class RenewableWakeLock implements SharedWakeLock {
wakeLock.setReferenceCounted(false);
wakeLock.acquire(durationMs + safetyMarginMs);
oldWakeLock.release();
future = scheduler.schedule(this::renew, durationMs, MILLISECONDS);
future = scheduler.schedule(this::renew, eventExecutor,
durationMs, MILLISECONDS);
acquired = now;
}
}