Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions erts/emulator/sys/unix/sys_signal_stack.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#if defined(__linux__)
# include <sys/auxv.h>
#endif

#include "sys.h"
#include "erl_alloc.h"
Expand All @@ -88,29 +91,25 @@
#endif

/*
* Set alternate signal stack for the invoking thread.
* Set up alternate signal stack for an Erlang process scheduler thread.
*/
static void sys_sigaltstack(void *ss_sp) {
void sys_thread_init_signal_stack(void) {
stack_t ss;

ss.ss_sp = ss_sp;
ss.ss_flags = 0;
#if defined(__linux__) && defined(AT_MINSIGSTKSZ)
ss.ss_size = (size_t) getauxval(AT_MINSIGSTKSZ);
ss.ss_size = MAX(ss.ss_size, SIGSTKSZ);
#else
ss.ss_size = SIGSTKSZ;
#endif
ss.ss_sp = malloc(ss.ss_size); // Never freed
ss.ss_flags = 0;

if (sigaltstack(&ss, NULL) < 0) {
ERTS_INTERNAL_ERROR("Failed to set alternate signal stack");
}
}

/*
* Set up alternate signal stack for an Erlang process scheduler thread.
*/
void sys_thread_init_signal_stack(void) {
/* This will never be freed. */
char *stack = malloc(SIGSTKSZ);
sys_sigaltstack(stack);
}

/*
* 1. Set up alternate signal stack for the main thread.
* 2. Add SA_ONSTACK to existing user-defined signal handlers.
Expand Down
Loading