3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 17:15:31 +00:00

ensure that timeouts are distinguished from other cancel events #848

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2017-08-18 14:54:54 -07:00
parent 7d8c745c89
commit 7a977f0106
10 changed files with 55 additions and 10 deletions

View file

@ -31,10 +31,14 @@ class cancel_eh : public event_handler {
public:
cancel_eh(T & o): m_canceled(false), m_obj(o) {}
~cancel_eh() { if (m_canceled) m_obj.dec_cancel(); }
virtual void operator()() {
m_canceled = true;
m_obj.inc_cancel();
virtual void operator()(event_handler_caller_t caller_id) {
if (!m_canceled) {
m_caller_id = caller_id;
m_canceled = true;
m_obj.inc_cancel();
}
}
bool canceled() const { return m_canceled; }
};
#endif

View file

@ -19,10 +19,22 @@ Revision History:
#ifndef EVENT_HANDLER_H_
#define EVENT_HANDLER_H_
enum event_handler_caller_t {
UNSET_EH_CALLER,
CTRL_C_EH_CALLER,
TIMEOUT_EH_CALLER,
RESLIMIT_EH_CALLER,
API_INTERRUPT_EH_CALLER
};
class event_handler {
protected:
event_handler_caller_t m_caller_id;
public:
event_handler(): m_caller_id(UNSET_EH_CALLER) {}
virtual ~event_handler() {}
virtual void operator()() = 0;
virtual void operator()(event_handler_caller_t caller_id) = 0;
event_handler_caller_t caller_id() const { return m_caller_id; }
};
#endif

View file

@ -24,7 +24,7 @@ scoped_ctrl_c * scoped_ctrl_c::g_obj = 0;
void scoped_ctrl_c::on_ctrl_c(int) {
if (g_obj->m_first) {
g_obj->m_cancel_eh();
g_obj->m_cancel_eh(CTRL_C_EH_CALLER);
if (g_obj->m_once) {
g_obj->m_first = false;
signal(SIGINT, on_ctrl_c); // re-install the handler

View file

@ -85,7 +85,7 @@ struct scoped_timer::imp {
obj->m_first = false;
}
else {
obj->m_eh->operator()();
obj->m_eh->operator()(TIMEOUT_EH_CALLER);
}
}
#elif defined(__APPLE__) && defined(__MACH__)

View file

@ -32,10 +32,11 @@ void (* g_on_timeout)() = 0;
class g_timeout_eh : public event_handler {
public:
void operator()() {
void operator()(event_handler_caller_t caller_id) {
#pragma omp critical (g_timeout_cs)
{
std::cout << "timeout\n";
m_caller_id = caller_id;
if (g_on_timeout)
g_on_timeout();
if (g_timeout)