MEDIUM: signal: signal_unregister() removes every handlers

The new function signal_unregister() removes every handlers assigned to
a signal. Once the handler list of the signal is empty, the signal is
ignored with SIG_IGN.
This commit is contained in:
William Lallemand 2018-11-20 17:36:52 +01:00 committed by Willy Tarreau
parent db6bdfbf68
commit 31a1c1d5e7
2 changed files with 21 additions and 0 deletions

View File

@ -32,6 +32,7 @@ struct sig_handler *signal_register_fct(int sig, void (*fct)(struct sig_handler
struct sig_handler *signal_register_task(int sig, struct task *task, int reason);
void signal_unregister_handler(struct sig_handler *handler);
void signal_unregister_target(int sig, void *target);
void signal_unregister(int sig);
void haproxy_unblock_signals();
static inline void signal_process_queue()

View File

@ -254,3 +254,23 @@ void signal_unregister_target(int sig, void *target)
}
}
}
/*
* Immedialtely unregister every handler assigned to a signal <sig>.
* Once the handler list is empty, the signal is ignored with SIG_IGN.
*/
void signal_unregister(int sig)
{
struct sig_handler *sh, *shb;
if (sig < 0 || sig >= MAX_SIGNAL)
return;
list_for_each_entry_safe(sh, shb, &signal_state[sig].handlers, list) {
LIST_DEL(&sh->list);
pool_free(pool_head_sig_handlers, sh);
}
signal(sig, SIG_IGN);
}