Commit 4280f845 authored by Max Kellermann's avatar Max Kellermann

event/SignalMonitor: use BoundMethod instead of raw function pointer

parent c3d9c326
...@@ -158,7 +158,7 @@ SignalMonitorFinish() ...@@ -158,7 +158,7 @@ SignalMonitorFinish()
sa.sa_handler = SIG_DFL; sa.sa_handler = SIG_DFL;
for (unsigned i = 0; i < MAX_SIGNAL; ++i) { for (unsigned i = 0; i < MAX_SIGNAL; ++i) {
if (signal_handlers[i] != nullptr) { if (signal_handlers[i]) {
x_sigaction(i, sa); x_sigaction(i, sa);
signal_handlers[i] = nullptr; signal_handlers[i] = nullptr;
} }
...@@ -179,7 +179,7 @@ SignalMonitorGetEventLoop() ...@@ -179,7 +179,7 @@ SignalMonitorGetEventLoop()
void void
SignalMonitorRegister(int signo, SignalHandler handler) SignalMonitorRegister(int signo, SignalHandler handler)
{ {
assert(signal_handlers[signo] == nullptr); assert(!signal_handlers[signo]);
#ifndef USE_SIGNALFD #ifndef USE_SIGNALFD
assert(!signal_pending[signo]); assert(!signal_pending[signo]);
#endif #endif
...@@ -209,7 +209,7 @@ SignalMonitor::OnSocketReady(unsigned) ...@@ -209,7 +209,7 @@ SignalMonitor::OnSocketReady(unsigned)
int signo; int signo;
while ((signo = fd.Read()) >= 0) { while ((signo = fd.Read()) >= 0) {
assert(unsigned(signo) < MAX_SIGNAL); assert(unsigned(signo) < MAX_SIGNAL);
assert(signal_handlers[signo] != nullptr); assert(signal_handlers[signo]);
signal_handlers[signo](); signal_handlers[signo]();
} }
......
...@@ -26,7 +26,9 @@ class EventLoop; ...@@ -26,7 +26,9 @@ class EventLoop;
#ifndef WIN32 #ifndef WIN32
typedef void (*SignalHandler)(); #include "util/BindMethod.hxx"
typedef BoundMethod<void()> SignalHandler;
/** /**
* Initialise the signal monitor subsystem. * Initialise the signal monitor subsystem.
......
...@@ -34,9 +34,10 @@ ...@@ -34,9 +34,10 @@
static constexpr Domain signal_handlers_domain("signal_handlers"); static constexpr Domain signal_handlers_domain("signal_handlers");
static void static void
HandleShutdownSignal() HandleShutdownSignal(void *ctx)
{ {
SignalMonitorGetEventLoop().Break(); auto &loop = *(EventLoop *)ctx;
loop.Break();
} }
static void static void
...@@ -47,7 +48,7 @@ x_sigaction(int signum, const struct sigaction *act) ...@@ -47,7 +48,7 @@ x_sigaction(int signum, const struct sigaction *act)
} }
static void static void
handle_reload_event(void) handle_reload_event(void *)
{ {
LogDebug(signal_handlers_domain, "got SIGHUP, reopening log files"); LogDebug(signal_handlers_domain, "got SIGHUP, reopening log files");
cycle_log_files(); cycle_log_files();
...@@ -68,10 +69,10 @@ SignalHandlersInit(EventLoop &loop) ...@@ -68,10 +69,10 @@ SignalHandlersInit(EventLoop &loop)
sa.sa_handler = SIG_IGN; sa.sa_handler = SIG_IGN;
x_sigaction(SIGPIPE, &sa); x_sigaction(SIGPIPE, &sa);
SignalMonitorRegister(SIGINT, HandleShutdownSignal); SignalMonitorRegister(SIGINT, {&loop, HandleShutdownSignal});
SignalMonitorRegister(SIGTERM, HandleShutdownSignal); SignalMonitorRegister(SIGTERM, {&loop, HandleShutdownSignal});
SignalMonitorRegister(SIGHUP, handle_reload_event); SignalMonitorRegister(SIGHUP, {nullptr, handle_reload_event});
#endif #endif
} }
......
...@@ -27,17 +27,18 @@ ...@@ -27,17 +27,18 @@
#include <signal.h> #include <signal.h>
static void static void
HandleShutdownSignal() HandleShutdownSignal(void *ctx)
{ {
SignalMonitorGetEventLoop().Break(); auto &loop = *(EventLoop *)ctx;
loop.Break();
} }
ShutdownHandler::ShutdownHandler(EventLoop &loop) ShutdownHandler::ShutdownHandler(EventLoop &loop)
{ {
SignalMonitorInit(loop); SignalMonitorInit(loop);
SignalMonitorRegister(SIGINT, HandleShutdownSignal); SignalMonitorRegister(SIGINT, {&loop, HandleShutdownSignal});
SignalMonitorRegister(SIGTERM, HandleShutdownSignal); SignalMonitorRegister(SIGTERM, {&loop, HandleShutdownSignal});
} }
ShutdownHandler::~ShutdownHandler() ShutdownHandler::~ShutdownHandler()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment