mirror of
https://github.com/Z3Prover/z3
synced 2026-06-19 15:16:29 +00:00
add set_canceled to smt_parallel to avoid deadlock
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
491d990ed1
commit
f2d5d6fecf
2 changed files with 23 additions and 6 deletions
|
|
@ -78,8 +78,10 @@ namespace smt {
|
|||
|
||||
lbool res = l_undef;
|
||||
try {
|
||||
if (!m.inc())
|
||||
if (!m.inc()) {
|
||||
b.set_canceled();
|
||||
return;
|
||||
}
|
||||
res = m_sls->check();
|
||||
} catch (z3_exception &ex) {
|
||||
// Cancellation is normal in portfolio mode
|
||||
|
|
@ -180,8 +182,9 @@ namespace smt {
|
|||
for (expr* lit : bb_candidate_lits) {
|
||||
if (is_retry && b.has_new_backbone_candidates(bb_candidate_epoch))
|
||||
break;
|
||||
if (!m.inc() || canceled())
|
||||
if (!m.inc() || canceled())
|
||||
break;
|
||||
|
||||
|
||||
expr* atom = lit;
|
||||
m.is_not(lit, atom);
|
||||
|
|
@ -218,11 +221,13 @@ namespace smt {
|
|||
}
|
||||
|
||||
if (!m.inc())
|
||||
return;
|
||||
break;
|
||||
if (!canceled())
|
||||
b.cancel_current_backbone_batch();
|
||||
bb_candidates.reset();
|
||||
}
|
||||
if (!m.inc())
|
||||
b.set_canceled();
|
||||
}
|
||||
|
||||
lbool parallel::backbones_worker::probe_literal(bool_var v, expr *e, bool is_retry) {
|
||||
|
|
@ -290,6 +295,7 @@ namespace smt {
|
|||
}
|
||||
if (!m.inc() || canceled()) {
|
||||
ctx->get_fparams().m_max_conflicts = old_max_conflicts;
|
||||
b.set_canceled();
|
||||
return;
|
||||
}
|
||||
if (!bb_candidate_lits.contains(lit)) // already handled in singleton core → backbone case below
|
||||
|
|
@ -391,7 +397,7 @@ namespace smt {
|
|||
while (true) {
|
||||
|
||||
if (!m.inc())
|
||||
return;
|
||||
break;
|
||||
if (canceled())
|
||||
break;
|
||||
|
||||
|
|
@ -515,6 +521,8 @@ namespace smt {
|
|||
|
||||
bb_curr_batch_candidates.reset();
|
||||
}
|
||||
if (!m.inc())
|
||||
b.set_canceled();
|
||||
}
|
||||
|
||||
void parallel::backbones_worker::cancel() {
|
||||
|
|
@ -655,6 +663,7 @@ namespace smt {
|
|||
core.reset();
|
||||
core.append(mus);
|
||||
core.append(unknown);
|
||||
b.set_canceled();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -764,7 +773,7 @@ namespace smt {
|
|||
bb_candidates local_candidates = find_backbone_candidates();
|
||||
b.collect_backbone_candidates(m_l2g, local_candidates);
|
||||
if (!m.inc())
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
lbool r = check_cube(cube);
|
||||
|
|
@ -777,7 +786,7 @@ namespace smt {
|
|||
}
|
||||
|
||||
if (!m.inc())
|
||||
return;
|
||||
break;
|
||||
|
||||
switch (r) {
|
||||
case l_undef: {
|
||||
|
|
@ -836,6 +845,8 @@ namespace smt {
|
|||
if (m_config.m_share_units)
|
||||
share_units();
|
||||
}
|
||||
if (!m.inc())
|
||||
b.set_canceled();
|
||||
}
|
||||
|
||||
parallel::worker::worker(unsigned id, parallel &p, expr_ref_vector const &_asms)
|
||||
|
|
@ -1684,6 +1695,11 @@ namespace smt {
|
|||
cancel_background_threads();
|
||||
}
|
||||
|
||||
void parallel::batch_manager::set_canceled() {
|
||||
std::scoped_lock lock(mux);
|
||||
cancel_background_threads();
|
||||
}
|
||||
|
||||
void parallel::batch_manager::set_exception(unsigned error_code) {
|
||||
std::scoped_lock lock(mux);
|
||||
IF_VERBOSE(1, verbose_stream() << "Batch manager setting exception code: " << error_code << ".\n");
|
||||
|
|
|
|||
|
|
@ -196,6 +196,7 @@ namespace smt {
|
|||
void set_sat(ast_translation& l2g, model& m);
|
||||
void set_exception(std::string const& msg);
|
||||
void set_exception(unsigned error_code);
|
||||
void set_canceled();
|
||||
void collect_statistics(::statistics& st) const;
|
||||
|
||||
void collect_backbone_candidates(ast_translation& l2g, bb_candidates& bb_candidates);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue