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:
parent
7d8c745c89
commit
7a977f0106
10 changed files with 55 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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__)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue