From c0214950bf6cda75995ec38b09ad49a5cebff807 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Sun, 18 Nov 2012 19:37:10 +0100 Subject: [PATCH] Handle SIGINT, produce solution on abort. --- src/main/scala/leon/synthesis/Synthesizer.scala | 15 ++++++++++++++- src/main/scala/leon/synthesis/rules/Cegis.scala | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index c5ae914f2..f33ffe5c9 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -6,6 +6,7 @@ import purescala.Definitions.{Program, FunDef} import purescala.TreeOps._ import purescala.Trees.{Expr, Not} import purescala.ScalaPrinter +import sun.misc.{Signal, SignalHandler} import solvers.Solver import java.io.File @@ -36,7 +37,10 @@ class Synthesizer(val reporter: Reporter, val worstSolution = Solution.choose(problem) + var continue = true + def synthesize(): Solution = { + continue = true workList.clear() workList += rootTask @@ -51,7 +55,16 @@ class Synthesizer(val reporter: Reporter, } } - var continue = true + val sigINT = new Signal("INT") + var oldHandler: SignalHandler = null + oldHandler = Signal.handle(sigINT, new SignalHandler { + def handle(sig: Signal) { + reporter.info("Aborting...") + continue = false; + Signal.handle(sigINT, oldHandler) + } + }) + while (!workList.isEmpty && continue) { val task = workList.dequeue() diff --git a/src/main/scala/leon/synthesis/rules/Cegis.scala b/src/main/scala/leon/synthesis/rules/Cegis.scala index 52691946d..bc992ee80 100644 --- a/src/main/scala/leon/synthesis/rules/Cegis.scala +++ b/src/main/scala/leon/synthesis/rules/Cegis.scala @@ -130,7 +130,7 @@ class CEGIS(synth: Synthesizer) extends Rule("CEGIS", synth, 150) { var predicates: Seq[Expr] = Seq() var continue = true - while (result.isEmpty && continue) { + while (result.isEmpty && continue && synth.continue) { val basePhi = currentF.entireFormula val constrainedPhi = And(basePhi +: predicates) //println("-"*80) @@ -211,7 +211,7 @@ class CEGIS(synth: Synthesizer) extends Rule("CEGIS", synth, 150) { lastF = currentF currentF = currentF.unroll unrolings += 1 - } while(unrolings < maxUnrolings && lastF != currentF && result.isEmpty) + } while(unrolings < maxUnrolings && lastF != currentF && result.isEmpty && synth.continue) result.getOrElse(RuleInapplicable) } -- GitLab