@@ -103,13 +103,23 @@ extern "C" {
103
103
m_out.flush ();
104
104
}
105
105
106
-
107
- solver2smt2_pp::solver2smt2_pp (ast_manager& m, char const * file): m_pp_util(m), m_out(file), m_tracked(m) {
106
+ solver2smt2_pp::solver2smt2_pp (ast_manager& m, char const * file):
107
+ m_pp_util(m), m_out(file), m_tracked(m) {
108
108
if (!m_out) {
109
109
throw default_exception (" could not open " + std::string (file) + " for output" );
110
110
}
111
111
}
112
112
113
+ void Z3_solver_ref::set_eh (event_handler* eh) {
114
+ std::lock_guard<std::mutex> lock (m_mux);
115
+ m_eh = eh;
116
+ }
117
+
118
+ void Z3_solver_ref::set_cancel () {
119
+ std::lock_guard<std::mutex> lock (m_mux);
120
+ if (m_eh) (*m_eh)(API_INTERRUPT_EH_CALLER);
121
+ }
122
+
113
123
void Z3_solver_ref::assert_expr (expr * e) {
114
124
if (m_pp) m_pp->assert_expr (e);
115
125
m_solver->assert_expr (e);
@@ -386,6 +396,10 @@ extern "C" {
386
396
Z3_CATCH;
387
397
}
388
398
399
+ void Z3_API Z3_solver_interrupt (Z3_context c, Z3_solver s) {
400
+ to_solver (s)->set_cancel ();
401
+ }
402
+
389
403
void Z3_API Z3_solver_pop (Z3_context c, Z3_solver s, unsigned n) {
390
404
Z3_TRY;
391
405
LOG_Z3_solver_pop (c, s, n);
@@ -538,6 +552,7 @@ extern "C" {
538
552
unsigned rlimit = to_solver (s)->m_params .get_uint (" rlimit" , mk_c (c)->get_rlimit ());
539
553
bool use_ctrl_c = to_solver (s)->m_params .get_bool (" ctrl_c" , true );
540
554
cancel_eh<reslimit> eh (mk_c (c)->m ().limit ());
555
+ to_solver (s)->set_eh (&eh);
541
556
api::context::set_interruptable si (*(mk_c (c)), eh);
542
557
lbool result;
543
558
{
@@ -550,12 +565,16 @@ extern "C" {
550
565
}
551
566
catch (z3_exception & ex) {
552
567
to_solver_ref (s)->set_reason_unknown (eh);
568
+ to_solver (s)->set_eh (nullptr );
553
569
if (!mk_c (c)->m ().canceled ()) {
554
570
mk_c (c)->handle_exception (ex);
555
571
}
556
572
return Z3_L_UNDEF;
557
573
}
574
+ catch (...) {
575
+ }
558
576
}
577
+ to_solver (s)->set_eh (nullptr );
559
578
if (result == l_undef) {
560
579
to_solver_ref (s)->set_reason_unknown (eh);
561
580
}
@@ -730,6 +749,7 @@ extern "C" {
730
749
unsigned rlimit = to_solver (s)->m_params .get_uint (" rlimit" , mk_c (c)->get_rlimit ());
731
750
bool use_ctrl_c = to_solver (s)->m_params .get_bool (" ctrl_c" , true );
732
751
cancel_eh<reslimit> eh (mk_c (c)->m ().limit ());
752
+ to_solver (s)->set_eh (&eh);
733
753
api::context::set_interruptable si (*(mk_c (c)), eh);
734
754
{
735
755
scoped_ctrl_c ctrlc (eh, false , use_ctrl_c);
@@ -740,12 +760,16 @@ extern "C" {
740
760
result = to_solver_ref (s)->get_consequences (_assumptions, _variables, _consequences);
741
761
}
742
762
catch (z3_exception & ex) {
763
+ to_solver (s)->set_eh (nullptr );
743
764
to_solver_ref (s)->set_reason_unknown (eh);
744
765
_assumptions.finalize (); _consequences.finalize (); _variables.finalize ();
745
766
mk_c (c)->handle_exception (ex);
746
767
return Z3_L_UNDEF;
747
768
}
769
+ catch (...) {
770
+ }
748
771
}
772
+ to_solver (s)->set_eh (nullptr );
749
773
if (result == l_undef) {
750
774
to_solver_ref (s)->set_reason_unknown (eh);
751
775
}
@@ -773,6 +797,7 @@ extern "C" {
773
797
unsigned rlimit = to_solver (s)->m_params .get_uint (" rlimit" , mk_c (c)->get_rlimit ());
774
798
bool use_ctrl_c = to_solver (s)->m_params .get_bool (" ctrl_c" , true );
775
799
cancel_eh<reslimit> eh (mk_c (c)->m ().limit ());
800
+ to_solver (s)->set_eh (&eh);
776
801
api::context::set_interruptable si (*(mk_c (c)), eh);
777
802
{
778
803
scoped_ctrl_c ctrlc (eh, false , use_ctrl_c);
@@ -782,10 +807,14 @@ extern "C" {
782
807
result.append (to_solver_ref (s)->cube (vars, cutoff));
783
808
}
784
809
catch (z3_exception & ex) {
810
+ to_solver (s)->set_eh (nullptr );
785
811
mk_c (c)->handle_exception (ex);
786
812
return nullptr ;
787
813
}
814
+ catch (...) {
815
+ }
788
816
}
817
+ to_solver (s)->set_eh (nullptr );
789
818
Z3_ast_vector_ref * v = alloc (Z3_ast_vector_ref, *mk_c (c), mk_c (c)->m ());
790
819
mk_c (c)->save_object (v);
791
820
for (expr* e : result) {
0 commit comments