mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
fix issues #581: nested timeouts canceled each-other
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
a020b13f10
commit
e29adbf304
12 changed files with 96 additions and 87 deletions
|
@ -26,12 +26,14 @@ Revision History:
|
|||
*/
|
||||
template<typename T>
|
||||
class cancel_eh : public event_handler {
|
||||
bool m_canceled;
|
||||
T & m_obj;
|
||||
public:
|
||||
cancel_eh(T & o):m_obj(o) {}
|
||||
~cancel_eh() { m_obj.reset_cancel(); }
|
||||
cancel_eh(T & o): m_canceled(false), m_obj(o) {}
|
||||
~cancel_eh() { if (m_canceled) m_obj.dec_cancel(); }
|
||||
virtual void operator()() {
|
||||
m_obj.cancel();
|
||||
m_canceled = true;
|
||||
m_obj.inc_cancel();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ uint64 reslimit::count() const {
|
|||
|
||||
bool reslimit::inc() {
|
||||
++m_count;
|
||||
return !m_cancel && (m_limit == 0 || m_count <= m_limit);
|
||||
return m_cancel == 0 && (m_limit == 0 || m_count <= m_limit);
|
||||
}
|
||||
|
||||
bool reslimit::inc(unsigned offset) {
|
||||
|
@ -46,7 +46,7 @@ void reslimit::push(unsigned delta_limit) {
|
|||
}
|
||||
m_limits.push_back(m_limit);
|
||||
m_limit = m_limit==0?new_limit:std::min(new_limit, m_limit);
|
||||
m_cancel = false;
|
||||
m_cancel = 0;
|
||||
}
|
||||
|
||||
void reslimit::pop() {
|
||||
|
@ -55,11 +55,11 @@ void reslimit::pop() {
|
|||
}
|
||||
m_limit = m_limits.back();
|
||||
m_limits.pop_back();
|
||||
m_cancel = false;
|
||||
m_cancel = 0;
|
||||
}
|
||||
|
||||
char const* reslimit::get_cancel_msg() const {
|
||||
if (m_cancel) {
|
||||
if (m_cancel > 0) {
|
||||
return Z3_CANCELED_MSG;
|
||||
}
|
||||
else {
|
||||
|
@ -84,7 +84,7 @@ void reslimit::pop_child() {
|
|||
void reslimit::cancel() {
|
||||
#pragma omp critical (reslimit_cancel)
|
||||
{
|
||||
set_cancel(true);
|
||||
set_cancel(m_cancel+1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,11 +92,28 @@ void reslimit::cancel() {
|
|||
void reslimit::reset_cancel() {
|
||||
#pragma omp critical (reslimit_cancel)
|
||||
{
|
||||
set_cancel(false);
|
||||
set_cancel(0);
|
||||
}
|
||||
}
|
||||
|
||||
void reslimit::set_cancel(bool f) {
|
||||
void reslimit::inc_cancel() {
|
||||
#pragma omp critical (reslimit_cancel)
|
||||
{
|
||||
set_cancel(m_cancel+1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void reslimit::dec_cancel() {
|
||||
#pragma omp critical (reslimit_cancel)
|
||||
{
|
||||
if (m_cancel > 0) {
|
||||
set_cancel(m_cancel-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void reslimit::set_cancel(unsigned f) {
|
||||
m_cancel = f;
|
||||
for (unsigned i = 0; i < m_children.size(); ++i) {
|
||||
m_children[i]->set_cancel(f);
|
||||
|
|
|
@ -22,13 +22,13 @@ Revision History:
|
|||
#include "vector.h"
|
||||
|
||||
class reslimit {
|
||||
volatile bool m_cancel;
|
||||
volatile unsigned m_cancel;
|
||||
uint64 m_count;
|
||||
uint64 m_limit;
|
||||
svector<uint64> m_limits;
|
||||
ptr_vector<reslimit> m_children;
|
||||
|
||||
void set_cancel(bool f);
|
||||
void set_cancel(unsigned f);
|
||||
|
||||
public:
|
||||
reslimit();
|
||||
|
@ -42,10 +42,13 @@ public:
|
|||
uint64 count() const;
|
||||
|
||||
|
||||
bool get_cancel_flag() const { return m_cancel; }
|
||||
bool get_cancel_flag() const { return m_cancel > 0; }
|
||||
char const* get_cancel_msg() const;
|
||||
void cancel();
|
||||
void reset_cancel();
|
||||
|
||||
void inc_cancel();
|
||||
void dec_cancel();
|
||||
};
|
||||
|
||||
class scoped_rlimit {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue