event/SignalMonitor: unblock signals after fork
Fixes hanging child process in the "pipe" output plugin.
This commit is contained in:
2
NEWS
2
NEWS
@@ -3,6 +3,8 @@ ver 0.18.9 (not yet released)
|
|||||||
- vorbis: fix linker failure when libvorbis/libogg are static
|
- vorbis: fix linker failure when libvorbis/libogg are static
|
||||||
* encoder
|
* encoder
|
||||||
- vorbis: fix another linker failure
|
- vorbis: fix another linker failure
|
||||||
|
* output
|
||||||
|
- pipe: fix hanging child process due to blocked signals
|
||||||
|
|
||||||
ver 0.18.8 (2014/02/07)
|
ver 0.18.8 (2014/02/07)
|
||||||
* decoder
|
* decoder
|
||||||
|
@@ -39,6 +39,10 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#ifdef USE_SIGNALFD
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
class SignalMonitor final : private SocketMonitor {
|
class SignalMonitor final : private SocketMonitor {
|
||||||
#ifdef USE_SIGNALFD
|
#ifdef USE_SIGNALFD
|
||||||
SignalFD fd;
|
SignalFD fd;
|
||||||
@@ -99,7 +103,21 @@ static std::atomic_bool signal_pending[MAX_SIGNAL];
|
|||||||
|
|
||||||
static Manual<SignalMonitor> monitor;
|
static Manual<SignalMonitor> monitor;
|
||||||
|
|
||||||
#ifndef USE_SIGNALFD
|
#ifdef USE_SIGNALFD
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a pthread_atfork() callback that unblocks the signals that
|
||||||
|
* were blocked for our signalfd(). Without this, our child processes
|
||||||
|
* would inherit the blocked signals.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
at_fork_child()
|
||||||
|
{
|
||||||
|
sigprocmask(SIG_UNBLOCK, &signal_mask, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SignalCallback(int signo)
|
SignalCallback(int signo)
|
||||||
{
|
{
|
||||||
@@ -108,6 +126,7 @@ SignalCallback(int signo)
|
|||||||
if (!signal_pending[signo].exchange(true))
|
if (!signal_pending[signo].exchange(true))
|
||||||
monitor->WakeUp();
|
monitor->WakeUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -115,6 +134,8 @@ SignalMonitorInit(EventLoop &loop)
|
|||||||
{
|
{
|
||||||
#ifdef USE_SIGNALFD
|
#ifdef USE_SIGNALFD
|
||||||
sigemptyset(&signal_mask);
|
sigemptyset(&signal_mask);
|
||||||
|
|
||||||
|
pthread_atfork(nullptr, nullptr, at_fork_child);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
monitor.Construct(loop);
|
monitor.Construct(loop);
|
||||||
|
Reference in New Issue
Block a user