diff --git a/src/slurmd/slurmstepd/mgr.c b/src/slurmd/slurmstepd/mgr.c index 066af313f58efc42eb2602ae9a0540b4658ce097..2cdd5a4cb2e775921941c7972e28cbbb628de36e 100644 --- a/src/slurmd/slurmstepd/mgr.c +++ b/src/slurmd/slurmstepd/mgr.c @@ -169,6 +169,7 @@ typedef struct kill_thread { * Job manager related prototypes */ static int _access(const char *path, int modes, uid_t uid, gid_t gid); +static void _block_signals(void); static void _send_launch_failure(launch_tasks_request_msg_t *, slurm_addr_t *, int); static int _drain_node(char *reason); @@ -196,6 +197,7 @@ static void _setargs(slurmd_job_t *job); static void _random_sleep(slurmd_job_t *job); static int _run_script_as_user(const char *name, const char *path, slurmd_job_t *job, int max_wait, char **env); +static void _unblock_signals(void); /* * Batch job management prototypes: @@ -997,7 +999,7 @@ job_manager(slurmd_job_t *job) io_close_task_fds(job); - xsignal_block(mgr_sigarray); + _block_signals(); reattach_job = job; job->state = SLURMSTEPD_STEP_RUNNING; @@ -1207,9 +1209,21 @@ static void prepare_stdio (slurmd_job_t *job, slurmd_task_info_t *task) return; } +static void _block_signals (void) +{ + int i; + + for (i = 0; mgr_sigarray[i]; i++) /* eliminate pending signals */ + xsignal(mgr_sigarray[i], SIG_IGN); + xsignal_block (mgr_sigarray); +} static void _unblock_signals (void) { sigset_t set; + int i; + + for (i = 0; mgr_sigarray[i]; i++) /* eliminate pending signals */ + xsignal(mgr_sigarray[i], SIG_DFL); sigemptyset(&set); xsignal_set_mask (&set); }