Last active
May 19, 2016 14:42
-
-
Save lpgauth/6520d13408e9d6264eb276c91524c488 to your computer and use it in GitHub Desktop.
18.3.3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 692a6e679412b3553aaf2aa9ffba33de6ca21a4e Mon Sep 17 00:00:00 2001 | |
From: Lukas Larsson <lukas@erlang.org> | |
Date: Tue, 23 Feb 2016 11:24:12 +0100 | |
Subject: [PATCH] erts: Fix install of suspend handler | |
This commit makes sure to setup the suspend handler | |
to matter what +B option is given at the command line. | |
--- | |
erts/emulator/beam/break.c | 4 ++-- | |
erts/emulator/beam/erl_init.c | 1 + | |
erts/emulator/sys/unix/erl_unix_sys.h | 1 + | |
erts/emulator/sys/unix/sys.c | 24 ++++++++++++++++-------- | |
4 files changed, 20 insertions(+), 10 deletions(-) | |
diff --git a/erts/emulator/beam/break.c b/erts/emulator/beam/break.c | |
index 0ddf7f4..298b30f 100644 | |
--- a/erts/emulator/beam/break.c | |
+++ b/erts/emulator/beam/break.c | |
@@ -684,7 +684,7 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) | |
crash dump. */ | |
erts_thr_progress_fatal_error_block(&tpd_buf); | |
-#ifdef ERTS_THR_HAVE_SIG_FUNCS | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
/* | |
* We suspend all scheduler threads so that we can dump some | |
* data about the currently running processes and scheduler data. | |
@@ -818,7 +818,7 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) | |
#ifdef ERTS_SMP | |
-#if defined(ERTS_THR_HAVE_SIG_FUNCS) | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
/* We resume all schedulers so that we are in a known safe state | |
when we write the rest of the crash dump */ | |
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c | |
index e729574..1718b23 100644 | |
--- a/erts/emulator/beam/erl_init.c | |
+++ b/erts/emulator/beam/erl_init.c | |
@@ -2134,6 +2134,7 @@ erl_start(int argc, char **argv) | |
init_break_handler(); | |
if (replace_intr) | |
erts_replace_intr(); | |
+ sys_init_suspend_handler(); | |
#endif | |
boot_argc = argc - i; /* Number of arguments to init */ | |
diff --git a/erts/emulator/sys/unix/erl_unix_sys.h b/erts/emulator/sys/unix/erl_unix_sys.h | |
index 8d4e98b..b55180c 100644 | |
--- a/erts/emulator/sys/unix/erl_unix_sys.h | |
+++ b/erts/emulator/sys/unix/erl_unix_sys.h | |
@@ -311,6 +311,7 @@ extern SIGFUNC sys_signal(int, SIGFUNC); | |
extern void sys_sigrelease(int); | |
extern void sys_sigblock(int); | |
extern void sys_stop_cat(void); | |
+extern void sys_init_suspend_handler(void); | |
/* | |
* Handling of floating point exceptions. | |
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c | |
index d94b374..cbd47db 100644 | |
--- a/erts/emulator/sys/unix/sys.c | |
+++ b/erts/emulator/sys/unix/sys.c | |
@@ -226,8 +226,10 @@ static erts_smp_atomic_t sys_misc_mem_sz; | |
static void smp_sig_notify(char c); | |
static int sig_notify_fds[2] = {-1, -1}; | |
+#if !defined(ETHR_UNUSABLE_SIGUSRX) && defined(ERTS_THR_HAVE_SIG_FUNCS) | |
static int sig_suspend_fds[2] = {-1, -1}; | |
#define ERTS_SYS_SUSPEND_SIGNAL SIGUSR2 | |
+#endif | |
#endif | |
@@ -872,7 +874,7 @@ sigusr1_exit(void) | |
#else | |
-#ifdef ERTS_SMP | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
void | |
sys_thr_suspend(erts_tid_t tid) { | |
erts_thr_kill(tid, ERTS_SYS_SUSPEND_SIGNAL); | |
@@ -900,7 +902,7 @@ static RETSIGTYPE user_signal1(int signum) | |
#endif | |
} | |
-#ifdef ERTS_SMP | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
#if (defined(SIG_SIGSET) || defined(SIG_SIGNAL)) | |
static RETSIGTYPE suspend_signal(void) | |
#else | |
@@ -913,7 +915,7 @@ static RETSIGTYPE suspend_signal(int signum) | |
res = read(sig_suspend_fds[0], buf, sizeof(int)); | |
} while (res < 0 && errno == EINTR); | |
} | |
-#endif /* #ifdef ERTS_SMP */ | |
+#endif /* #ifdef ERTS_SYS_SUSPEND_SIGNAL */ | |
#endif /* #ifndef ETHR_UNUSABLE_SIGUSRX */ | |
@@ -966,13 +968,17 @@ void init_break_handler(void) | |
sys_signal(SIGINT, request_break); | |
#ifndef ETHR_UNUSABLE_SIGUSRX | |
sys_signal(SIGUSR1, user_signal1); | |
-#ifdef ERTS_SMP | |
- sys_signal(ERTS_SYS_SUSPEND_SIGNAL, suspend_signal); | |
-#endif /* #ifdef ERTS_SMP */ | |
#endif /* #ifndef ETHR_UNUSABLE_SIGUSRX */ | |
sys_signal(SIGQUIT, do_quit); | |
} | |
+void sys_init_suspend_handler(void) | |
+{ | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
+ sys_signal(ERTS_SYS_SUSPEND_SIGNAL, suspend_signal); | |
+#endif | |
+} | |
+ | |
int sys_max_files(void) | |
{ | |
return(max_files); | |
@@ -990,7 +996,7 @@ static void block_signals(void) | |
#endif /* #ifndef ETHR_UNUSABLE_SIGUSRX */ | |
#endif /* #ifndef ERTS_SMP */ | |
-#if defined(ERTS_SMP) && !defined(ETHR_UNUSABLE_SIGUSRX) | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
sys_sigblock(ERTS_SYS_SUSPEND_SIGNAL); | |
#endif | |
@@ -1009,7 +1015,7 @@ static void unblock_signals(void) | |
#endif /* #ifndef ETHR_UNUSABLE_SIGUSRX */ | |
#endif /* #ifndef ERTS_SMP */ | |
-#if defined(ERTS_SMP) && !defined(ETHR_UNUSABLE_SIGUSRX) | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
sys_sigrelease(ERTS_SYS_SUSPEND_SIGNAL); | |
#endif | |
@@ -3248,12 +3254,14 @@ init_smp_sig_notify(void) | |
static void | |
init_smp_sig_suspend(void) { | |
+#ifdef ERTS_SYS_SUSPEND_SIGNAL | |
if (pipe(sig_suspend_fds) < 0) { | |
erts_exit(ERTS_ABORT_EXIT, | |
"Failed to create sig_suspend pipe: %s (%d)\n", | |
erl_errno_id(errno), | |
errno); | |
} | |
+#endif | |
} | |
#ifdef __DARWIN__ | |
-- | |
2.8.0.rc3 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment