diff --git a/src/main/scala/leon/utils/InterruptManager.scala b/src/main/scala/leon/utils/InterruptManager.scala index 29a79bafbfab37caebe74ae62d4410f97af72f20..40d8dd1836a8eacecadbc823c68e29fa4b232ca7 100644 --- a/src/main/scala/leon/utils/InterruptManager.scala +++ b/src/main/scala/leon/utils/InterruptManager.scala @@ -5,36 +5,32 @@ package utils import scala.collection.JavaConversions._ -import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.{AtomicLong, AtomicBoolean} import sun.misc.{Signal, SignalHandler} import java.util.WeakHashMap class InterruptManager(reporter: Reporter) extends Interruptible { private[this] val interruptibles = new WeakHashMap[Interruptible, Boolean]() private[this] val sigINT = new Signal("INT") - private[this] val withinTimeout: AtomicBoolean = new AtomicBoolean(false) + + private[this] val lastTimestamp = new AtomicLong(0L) + private val exitWindow = 1000L + private[this] val handler = new SignalHandler { def handle(sig: Signal) { - println() - if (withinTimeout.get()) { + def now(): Long = System.currentTimeMillis() + reporter.info("") + if (now() - lastTimestamp.get < exitWindow) { reporter.warning("Aborting Leon...") System.exit(1) } else { reporter.warning("Interrupted...") - setTimeout() + lastTimestamp.set(now()) interrupt() } } } - private val exitWindow = 1000 - private[this] def setTimeout() = { - import scala.concurrent.Future - import scala.concurrent.ExecutionContext.Implicits.global - withinTimeout.set(true) - Future { Thread.sleep(exitWindow) } onComplete { _ => withinTimeout.set(false) } - () - } val interrupted: AtomicBoolean = new AtomicBoolean(false)