mirror of
https://github.com/Z3Prover/z3
synced 2025-08-07 03:31:23 +00:00
Fix SIGINT handler to use sigaction with SA_ONSTACK flag
Related to #7305 Update SIGINT signal handler to use `sigaction` with `SA_ONSTACK` flag. * Replace `signal` function with `sigaction` function in `src/util/scoped_ctrl_c.cpp` to register the SIGINT handler. * Set the `SA_ONSTACK` flag for the SIGINT signal handler in `src/util/scoped_ctrl_c.cpp`. * Update `on_ctrl_c` function to use `sigaction` in `src/util/scoped_ctrl_c.cpp`. * Modify `scoped_ctrl_c` struct in `src/util/scoped_ctrl_c.h` to include `struct sigaction m_old_action` instead of `void (STD_CALL *m_old_handler)(int)`. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/Z3Prover/z3/issues/7305?shareId=XXXX-XXXX-XXXX-XXXX).
This commit is contained in:
parent
1e6b13741c
commit
62b530e945
2 changed files with 9 additions and 8 deletions
|
@ -26,11 +26,10 @@ static void on_ctrl_c(int) {
|
||||||
g_obj->m_cancel_eh(CTRL_C_EH_CALLER);
|
g_obj->m_cancel_eh(CTRL_C_EH_CALLER);
|
||||||
if (g_obj->m_once) {
|
if (g_obj->m_once) {
|
||||||
g_obj->m_first = false;
|
g_obj->m_first = false;
|
||||||
signal(SIGINT, on_ctrl_c); // re-install the handler
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
signal(SIGINT, g_obj->m_old_handler);
|
sigaction(SIGINT, &g_obj->m_old_action, nullptr);
|
||||||
raise(SIGINT);
|
raise(SIGINT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,15 +42,17 @@ scoped_ctrl_c::scoped_ctrl_c(event_handler & eh, bool once, bool enabled):
|
||||||
m_old_scoped_ctrl_c(g_obj) {
|
m_old_scoped_ctrl_c(g_obj) {
|
||||||
if (m_enabled) {
|
if (m_enabled) {
|
||||||
g_obj = this;
|
g_obj = this;
|
||||||
m_old_handler = signal(SIGINT, on_ctrl_c);
|
struct sigaction sa;
|
||||||
|
sa.sa_handler = on_ctrl_c;
|
||||||
|
sa.sa_flags = SA_ONSTACK;
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sigaction(SIGINT, &sa, &m_old_action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_ctrl_c::~scoped_ctrl_c() {
|
scoped_ctrl_c::~scoped_ctrl_c() {
|
||||||
if (m_enabled) {
|
if (m_enabled) {
|
||||||
g_obj = m_old_scoped_ctrl_c;
|
g_obj = m_old_scoped_ctrl_c;
|
||||||
if (m_old_handler != SIG_ERR) {
|
sigaction(SIGINT, &m_old_action, nullptr);
|
||||||
signal(SIGINT, m_old_handler);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,13 +20,14 @@ Revision History:
|
||||||
|
|
||||||
#include "util/event_handler.h"
|
#include "util/event_handler.h"
|
||||||
#include "util/util.h"
|
#include "util/util.h"
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
struct scoped_ctrl_c {
|
struct scoped_ctrl_c {
|
||||||
event_handler & m_cancel_eh;
|
event_handler & m_cancel_eh;
|
||||||
bool m_first;
|
bool m_first;
|
||||||
bool m_once;
|
bool m_once;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
void (STD_CALL *m_old_handler)(int);
|
struct sigaction m_old_action;
|
||||||
scoped_ctrl_c * m_old_scoped_ctrl_c;
|
scoped_ctrl_c * m_old_scoped_ctrl_c;
|
||||||
public:
|
public:
|
||||||
// If once == true, then the cancel_eh is invoked only at the first Ctrl-C.
|
// If once == true, then the cancel_eh is invoked only at the first Ctrl-C.
|
||||||
|
@ -36,4 +37,3 @@ public:
|
||||||
~scoped_ctrl_c();
|
~scoped_ctrl_c();
|
||||||
void reset() { m_first = true; }
|
void reset() { m_first = true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue