aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS8
-rw-r--r--configure.ac4
-rw-r--r--src/event/SignalMonitor.cxx23
3 files changed, 32 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index d88d6da08..25a1d1dd7 100644
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,14 @@ ver 0.19 (not yet released)
* allow playlist directory without music directory
* install systemd unit for socket activation
+ver 0.18.9 (not yet released)
+* decoder
+ - vorbis: fix linker failure when libvorbis/libogg are static
+* encoder
+ - vorbis: fix another linker failure
+* output
+ - pipe: fix hanging child process due to blocked signals
+
ver 0.18.8 (2014/02/07)
* decoder
- ffmpeg: support libav v10_alpha1
diff --git a/configure.ac b/configure.ac
index f74509755..1ac6d2a9d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1222,7 +1222,7 @@ if test x$enable_tremor = xyes; then
fi
fi
-MPD_AUTO_PKG(vorbis, VORBIS, [vorbis vorbisfile ogg],
+MPD_AUTO_PKG(vorbis, VORBIS, [vorbisfile vorbis ogg],
[Ogg Vorbis decoder], [libvorbis not found])
if test x$enable_vorbis = xyes; then
AC_DEFINE(ENABLE_VORBIS_DECODER, 1, [Define for Ogg Vorbis support])
@@ -1350,7 +1350,7 @@ fi
AM_CONDITIONAL(ENABLE_SHINE_ENCODER, test x$enable_shine_encoder = xyes)
dnl ---------------------------- Ogg Vorbis Encoder ---------------------------
-MPD_AUTO_PKG(vorbis_encoder, VORBISENC, [vorbisenc vorbis],
+MPD_AUTO_PKG(vorbis_encoder, VORBISENC, [vorbisenc vorbis ogg],
[Ogg Vorbis encoder], [libvorbisenc not found])
if test x$enable_vorbis_encoder = xyes; then
diff --git a/src/event/SignalMonitor.cxx b/src/event/SignalMonitor.cxx
index a845030c4..2d8fe681f 100644
--- a/src/event/SignalMonitor.cxx
+++ b/src/event/SignalMonitor.cxx
@@ -39,6 +39,10 @@
#include <algorithm>
+#ifdef USE_SIGNALFD
+#include <pthread.h>
+#endif
+
#include <assert.h>
#include <signal.h>
@@ -94,7 +98,21 @@ static std::atomic_bool signal_pending[MAX_SIGNAL];
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
SignalCallback(int signo)
{
@@ -103,6 +121,7 @@ SignalCallback(int signo)
if (!signal_pending[signo].exchange(true))
monitor->WakeUp();
}
+
#endif
void
@@ -110,6 +129,8 @@ SignalMonitorInit(EventLoop &loop)
{
#ifdef USE_SIGNALFD
sigemptyset(&signal_mask);
+
+ pthread_atfork(nullptr, nullptr, at_fork_child);
#endif
monitor.Construct(loop);