From 3791b382966a2975c8bc2c82f05ad96f19a1b254 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 12 Dec 2018 05:26:52 +0300 Subject: [PATCH] Better compile-time dispatching on function type. GitOrigin-RevId: 2687fa402c9c76ad654bdad0759893dc6df6262e --- tdutils/td/utils/port/signals.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tdutils/td/utils/port/signals.cpp b/tdutils/td/utils/port/signals.cpp index 8627474d..75ccb5a4 100644 --- a/tdutils/td/utils/port/signals.cpp +++ b/tdutils/td/utils/port/signals.cpp @@ -63,23 +63,24 @@ Status setup_signals_alt_stack() { } #if TD_PORT_POSIX +static void set_handler(struct sigaction &act, decltype(act.sa_handler) handler) { + act.sa_handler = handler; +} +static void set_handler(struct sigaction &act, decltype(act.sa_sigaction) handler) { + act.sa_sigaction = handler; + act.sa_flags |= SA_SIGINFO; +} template -static Status set_signal_handler_impl(vector signals, F func, bool is_extended = false) { +static Status set_signal_handler_impl(vector signals, F func) { struct sigaction act; std::memset(&act, '\0', sizeof(act)); - if (is_extended) { // TODO if constexpr, remove useless reinterpret_cast - act.sa_handler = reinterpret_cast(func); - } else { - act.sa_sigaction = reinterpret_cast(func); - } + sigemptyset(&act.sa_mask); for (auto signal : signals) { sigaddset(&act.sa_mask, signal); } act.sa_flags = SA_RESTART | SA_ONSTACK; - if (is_extended) { - act.sa_flags |= SA_SIGINFO; - } + set_handler(act, func); for (auto signal : signals) { if (sigaction(signal, &act, nullptr) != 0) { @@ -111,7 +112,7 @@ static vector get_native_signals(SignalType type) { } #endif #if TD_PORT_WINDOWS -static Status set_signal_handler_impl(vector signals, void (*func)(int sig), bool /*unused*/ = true) { +static Status set_signal_handler_impl(vector signals, void (*func)(int sig)) { for (auto signal : signals) { if (std::signal(signal, func) == SIG_ERR) { return Status::Error("Failed to set signal handler"); @@ -171,7 +172,7 @@ Status set_extended_signal_handler(SignalType type, extended_signal_handler func UNREACHABLE(); } } - return set_signal_handler_impl(std::move(signals), siginfo_handler, true); + return set_signal_handler_impl(std::move(signals), siginfo_handler); } Status set_runtime_signal_handler(int runtime_signal_number, void (*func)(int)) {