diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index cfda7c67b..1119f53ee 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -31,10 +31,10 @@
-
-
+
+
diff --git a/main/commons/src/main/java/org/cryptomator/common/ShutdownHook.java b/main/commons/src/main/java/org/cryptomator/common/ShutdownHook.java
index 866d5edfc..0fcb9d676 100644
--- a/main/commons/src/main/java/org/cryptomator/common/ShutdownHook.java
+++ b/main/commons/src/main/java/org/cryptomator/common/ShutdownHook.java
@@ -12,15 +12,18 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.PriorityBlockingQueue;
@Singleton
public class ShutdownHook extends Thread {
+ private static final int PRIO_VERY_LAST = Integer.MIN_VALUE;
+ public static final int PRIO_LAST = PRIO_VERY_LAST + 1;
+ public static final int PRIO_DEFAULT = 0;
+ public static final int PRIO_FIRST = Integer.MAX_VALUE;
private static final Logger LOG = LoggerFactory.getLogger(ShutdownHook.class);
- private static final Runnable POISON = Runnables.doNothing();
-
- private final Queue tasks = new ConcurrentLinkedQueue<>();
+ private static final OrderedTask POISON = new OrderedTask(PRIO_VERY_LAST, Runnables.doNothing());
+ private final Queue tasks = new PriorityBlockingQueue<>();
@Inject
ShutdownHook() {
@@ -43,8 +46,51 @@ public class ShutdownHook extends Thread {
}
}
+ /**
+ * Schedules a task to be run during shutdown with default order
+ *
+ * @param task The task to be scheduled
+ */
public void runOnShutdown(Runnable task) {
- tasks.add(task);
+ runOnShutdown(PRIO_DEFAULT, task);
}
-
+
+ /**
+ * Schedules a task to be run with the given priority
+ *
+ * @param priority Tasks with high priority will be run before task with lower priority
+ * @param task The task to be scheduled
+ */
+ public void runOnShutdown(int priority, Runnable task) {
+ tasks.add(new OrderedTask(priority, task));
+ }
+
+ private static class OrderedTask implements Comparable, Runnable {
+
+ private final int priority;
+ private final Runnable task;
+
+ public OrderedTask(int priority, Runnable task) {
+ this.priority = priority;
+ this.task = task;
+ }
+
+ @Override
+ public int compareTo(OrderedTask other) {
+ // overflow-safe signum impl:
+ if (this.priority > other.priority) {
+ return -1; // higher prio -> this before other
+ } else if (this.priority < other.priority) {
+ return +1; // lower prio -> other before this
+ } else {
+ return 0; // same prio
+ }
+ }
+
+ @Override
+ public void run() {
+ task.run();
+ }
+ }
+
}
\ No newline at end of file
diff --git a/main/launcher/src/main/java/org/cryptomator/logging/LoggerConfiguration.java b/main/launcher/src/main/java/org/cryptomator/logging/LoggerConfiguration.java
index d1916abee..cb3bf6ff1 100644
--- a/main/launcher/src/main/java/org/cryptomator/logging/LoggerConfiguration.java
+++ b/main/launcher/src/main/java/org/cryptomator/logging/LoggerConfiguration.java
@@ -5,9 +5,8 @@ import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.hook.DelayingShutdownHook;
-import ch.qos.logback.core.util.Duration;
import org.cryptomator.common.Environment;
+import org.cryptomator.common.ShutdownHook;
import javax.inject.Inject;
import javax.inject.Named;
@@ -16,26 +15,27 @@ import java.util.Map;
@Singleton
public class LoggerConfiguration {
-
- private static final double SHUTDOWN_DELAY_MS = 100;
-
+
private final LoggerContext context;
private final Environment environment;
private final Appender stdout;
private final Appender upgrade;
private final Appender file;
+ private final ShutdownHook shutdownHook;
@Inject
LoggerConfiguration(LoggerContext context, //
Environment environment, //
@Named("stdoutAppender") Appender stdout, //
@Named("upgradeAppender") Appender upgrade, //
- @Named("fileAppender") Appender file) {
+ @Named("fileAppender") Appender file, //
+ ShutdownHook shutdownHook) {
this.context = context;
this.environment = environment;
this.stdout = stdout;
this.upgrade = upgrade;
this.file = file;
+ this.shutdownHook = shutdownHook;
}
public void init() {
@@ -62,9 +62,7 @@ public class LoggerConfiguration {
upgrades.setAdditive(false);
// add shutdown hook
- DelayingShutdownHook shutdownHook = new DelayingShutdownHook();
- shutdownHook.setContext(context);
- shutdownHook.setDelay(Duration.buildByMilliseconds(SHUTDOWN_DELAY_MS));
+ shutdownHook.runOnShutdown(ShutdownHook.PRIO_LAST, context::stop);
}
}