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); } }