projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[corlib] Add API to uninstall/reinstall signal handlers.
[mono.git]
/
mono
/
mini
/
mini-posix.c
diff --git
a/mono/mini/mini-posix.c
b/mono/mini/mini-posix.c
index e192403487b04d4571351f9551a91bac3e4e065f..b0d7a0709db70da65da166e78c821cdd66b50743 100644
(file)
--- a/
mono/mini/mini-posix.c
+++ b/
mono/mini/mini-posix.c
@@
-140,11
+140,15
@@
mono_gdb_render_native_backtraces (pid_t crashed_pid)
static GHashTable *mono_saved_signal_handlers = NULL;
static struct sigaction *
static GHashTable *mono_saved_signal_handlers = NULL;
static struct sigaction *
-get_saved_signal_handler (int signo)
+get_saved_signal_handler (int signo
, gboolean remove
)
{
{
- if (mono_saved_signal_handlers)
+ if (mono_saved_signal_handlers)
{
/* The hash is only modified during startup, so no need for locking */
/* The hash is only modified during startup, so no need for locking */
- return (struct sigaction *)g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
+ struct sigaction *handler = g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
+ if (remove && handler)
+ g_hash_table_remove (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
+ return handler;
+ }
return NULL;
}
return NULL;
}
@@
-191,7
+195,7
@@
gboolean
MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal)
{
int signal = MONO_SIG_HANDLER_GET_SIGNO ();
MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal)
{
int signal = MONO_SIG_HANDLER_GET_SIGNO ();
- struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal);
+ struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal
, FALSE
);
if (saved_handler && saved_handler->sa_handler) {
if (!(saved_handler->sa_flags & SA_SIGINFO)) {
if (saved_handler && saved_handler->sa_handler) {
if (!(saved_handler->sa_flags & SA_SIGINFO)) {
@@
-446,7
+450,7
@@
static void
remove_signal_handler (int signo)
{
struct sigaction sa;
remove_signal_handler (int signo)
{
struct sigaction sa;
- struct sigaction *saved_action = get_saved_signal_handler (signo);
+ struct sigaction *saved_action = get_saved_signal_handler (signo
, TRUE
);
if (!saved_action) {
sa.sa_handler = SIG_DFL;
if (!saved_action) {
sa.sa_handler = SIG_DFL;