diff --git a/prov/shm/src/smr_init.c b/prov/shm/src/smr_init.c index 9674d3321a3..f3189fcbd69 100644 --- a/prov/shm/src/smr_init.c +++ b/prov/shm/src/smr_init.c @@ -36,6 +36,8 @@ #include "smr.h" #include "smr_signal.h" +extern struct sigaction *old_action; + struct smr_env smr_env = { .disable_cma = 0, }; @@ -153,6 +155,7 @@ static int smr_getinfo(uint32_t version, const char *node, const char *service, static void smr_fini(void) { smr_cleanup(); + free(old_action); } struct fi_provider smr_prov = { @@ -177,7 +180,12 @@ SHM_INI copying data directly between processes (default: no)"); smr_init_env(); + old_action = calloc(SIGRTMIN, sizeof(*old_action)); + if (!old_action) + return NULL; /* Signal handlers to cleanup tmpfs files on an unclean shutdown */ + assert(SIGBUS < SIGRTMIN && SIGSEGV < SIGRTMIN + && SIGTERM < SIGRTMIN && SIGINT < SIGRTMIN); smr_reg_sig_hander(SIGBUS); smr_reg_sig_hander(SIGSEGV); smr_reg_sig_hander(SIGTERM); diff --git a/prov/shm/src/smr_signal.h b/prov/shm/src/smr_signal.h index d1e6995a6b9..67f6d285f4e 100644 --- a/prov/shm/src/smr_signal.h +++ b/prov/shm/src/smr_signal.h @@ -36,7 +36,7 @@ #include #include -struct sigaction old_action; +struct sigaction *old_action; static void smr_handle_signal(int signum, siginfo_t *info, void *ucontext) { @@ -49,7 +49,7 @@ static void smr_handle_signal(int signum, siginfo_t *info, void *ucontext) } /* Register the original signum handler, SIG_DFL or otherwise */ - ret = sigaction(signum, &old_action, NULL); + ret = sigaction(signum, &old_action[signum], NULL); if (ret) return; @@ -66,7 +66,7 @@ static void smr_reg_sig_hander(int signum) action.sa_sigaction = smr_handle_signal; action.sa_flags |= SA_SIGINFO; - ret = sigaction(signum, &action, &old_action); + ret = sigaction(signum, &action, &old_action[signum]); if (ret) FI_WARN(&smr_prov, FI_LOG_FABRIC, "Unable to register handler for sig %d\n", signum);