aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-08-19 03:31:25 -0700
committerEric Wong <normalperson@yhbt.net>2008-08-19 03:31:25 -0700
commit548385ac6cc0bc344762e19117f94258e7ea2251 (patch)
treedcd2bae159f63d7a234d3ff740402aceea47dfcf /src
parent3befb84a6a7a95de7e0e94c2f0bd9936ecb60668 (diff)
downloadmpd-548385ac6cc0bc344762e19117f94258e7ea2251.tar.gz
mpd-548385ac6cc0bc344762e19117f94258e7ea2251.tar.xz
mpd-548385ac6cc0bc344762e19117f94258e7ea2251.zip
fix output buffer deadlock when daemonizing
We spawned the output buffer thread before daemonizing in initPlayerData(), which is ultra bad because daemonizes forks and threads are not preserved on exit. Since playerData has been stripped bare by this core-rewrite anyways, move this code into the outputBuffer_* group and drop playerData.[ch] completely I completely forgot to test this :<
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am3
-rw-r--r--src/audio.c1
-rw-r--r--src/decode.c1
-rw-r--r--src/inputPlugin.h1
-rw-r--r--src/inputPlugins/audiofile_plugin.c1
-rw-r--r--src/inputPlugins/mod_plugin.c1
-rw-r--r--src/inputPlugins/wavpack_plugin.c1
-rw-r--r--src/main.c4
-rw-r--r--src/outputBuffer.c23
-rw-r--r--src/outputBuffer.h7
-rw-r--r--src/outputBuffer_config_init.h (renamed from src/playerData.c)66
-rw-r--r--src/playerData.h29
12 files changed, 48 insertions, 90 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 93943db23..6c52dde1e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -61,6 +61,7 @@ mpd_headers = \
compress.h \
os_compat.h \
outputBuffer.h \
+ outputBuffer_config_init.h \
outputBuffer_accessors.h \
outputBuffer_audio.h \
outputBuffer_ob_send.h \
@@ -69,7 +70,6 @@ mpd_headers = \
pcm_utils.h \
permission.h \
player_error.h \
- playerData.h \
playlist.h \
replayGain.h \
ringbuf.h \
@@ -126,7 +126,6 @@ mpd_SOURCES = \
pcm_utils.c \
permission.c \
player_error.c \
- playerData.c \
playlist.c \
replayGain.c \
ringbuf.c \
diff --git a/src/audio.c b/src/audio.c
index 9f6bedc33..34b74e6e1 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -20,7 +20,6 @@
#include "audioOutput.h"
#include "log.h"
#include "command.h"
-#include "playerData.h"
#include "path.h"
#include "ack.h"
#include "myfprintf.h"
diff --git a/src/decode.c b/src/decode.c
index 12c1b8746..150a0a58b 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -20,7 +20,6 @@
#include "outputBuffer.h"
#include "player_error.h"
#include "playlist.h"
-#include "playerData.h"
#include "pcm_utils.h"
#include "path.h"
#include "log.h"
diff --git a/src/inputPlugin.h b/src/inputPlugin.h
index 169781931..61cef9bef 100644
--- a/src/inputPlugin.h
+++ b/src/inputPlugin.h
@@ -21,7 +21,6 @@
#include "inputStream.h"
#include "outputBuffer.h"
-#include "playerData.h"
/* valid values for streamTypes in the InputPlugin struct: */
#define INPUT_PLUGIN_STREAM_FILE 0x01
diff --git a/src/inputPlugins/audiofile_plugin.c b/src/inputPlugins/audiofile_plugin.c
index 8178972ff..114a87786 100644
--- a/src/inputPlugins/audiofile_plugin.c
+++ b/src/inputPlugins/audiofile_plugin.c
@@ -26,7 +26,6 @@
#include "../audio.h"
#include "../log.h"
#include "../pcm_utils.h"
-#include "../playerData.h"
#include "../os_compat.h"
#include <audiofile.h>
diff --git a/src/inputPlugins/mod_plugin.c b/src/inputPlugins/mod_plugin.c
index cfa7d6e3d..9f9da6273 100644
--- a/src/inputPlugins/mod_plugin.c
+++ b/src/inputPlugins/mod_plugin.c
@@ -24,7 +24,6 @@
#include "../audio.h"
#include "../log.h"
#include "../pcm_utils.h"
-#include "../playerData.h"
#include "../os_compat.h"
#include <mikmod.h>
diff --git a/src/inputPlugins/wavpack_plugin.c b/src/inputPlugins/wavpack_plugin.c
index ef02712d7..2538be326 100644
--- a/src/inputPlugins/wavpack_plugin.c
+++ b/src/inputPlugins/wavpack_plugin.c
@@ -26,7 +26,6 @@
#include "../audio.h"
#include "../log.h"
#include "../pcm_utils.h"
-#include "../playerData.h"
#include "../outputBuffer.h"
#include "../os_compat.h"
#include "../path.h"
diff --git a/src/main.c b/src/main.c
index e02085294..239296501 100644
--- a/src/main.c
+++ b/src/main.c
@@ -23,7 +23,6 @@
#include "listen.h"
#include "conf.h"
#include "path.h"
-#include "playerData.h"
#include "stats.h"
#include "sig_handlers.h"
#include "audio.h"
@@ -412,7 +411,7 @@ int main(int argc, char *argv[])
openDB(&options, argv[0]);
initCommands();
- initPlayerData();
+ config_output_buffer();
initAudioConfig();
initAudioDriver();
initVolume();
@@ -424,6 +423,7 @@ int main(int argc, char *argv[])
daemonize(&options);
init_main_notify();
+ init_output_buffer();
setup_log_output(options.stdOutput);
initSigHandlers();
diff --git a/src/outputBuffer.c b/src/outputBuffer.c
index 26e6077f2..26d31b2cd 100644
--- a/src/outputBuffer.c
+++ b/src/outputBuffer.c
@@ -78,12 +78,6 @@ static struct output_buffer ob;
#include "outputBuffer_xfade.h"
#include "outputBuffer_accessors.h"
-static void ob_free(void)
-{
- free(ob.chunks);
- ringbuf_free(ob.index);
-}
-
static enum action_status ob_do_stop(void);
static void stop_playback(void)
{
@@ -497,22 +491,7 @@ out:
return NULL;
}
-void ob_init(size_t size)
-{
- pthread_attr_t attr;
- assert(size > 0 && !ob.index && !ob.chunks);
- ob.index = ringbuf_create(size);
- ob.chunks = xcalloc(ob.index->size, sizeof(struct ob_chunk));
- ob.preseek_len = xmalloc(ob.index->size * sizeof(ob.chunks[0].len));
- ob.nr_bpp = 1;
- ob.state = OB_STATE_STOP;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (pthread_create(&ob.thread, &attr, ob_task, NULL))
- FATAL("Failed to spawn player task: %s\n", strerror(errno));
- atexit(ob_free);
-}
+#include "outputBuffer_config_init.h"
void ob_seek_start(void)
{
diff --git a/src/outputBuffer.h b/src/outputBuffer.h
index 833a29e77..187846ef3 100644
--- a/src/outputBuffer.h
+++ b/src/outputBuffer.h
@@ -47,7 +47,7 @@ enum ob_action {
/* 1020 bytes since its divisible for 8, 16, 24, and 32-bit audio */
#define CHUNK_SIZE 1020
-void ob_init(size_t size);
+void ob_flush(void);
enum ob_drop_type { OB_DROP_DECODED, OB_DROP_PLAYING };
void ob_drop_audio(enum ob_drop_type type);
@@ -101,8 +101,9 @@ AudioFormat *ob_audio_format(void);
void ob_advance_sequence(void);
-void ob_wait_sync(void);
-
void ob_flush(void);
+void config_output_buffer(void);
+void init_output_buffer(void);
+
#endif
diff --git a/src/playerData.c b/src/outputBuffer_config_init.h
index 113a71f35..ba5b7f137 100644
--- a/src/playerData.c
+++ b/src/outputBuffer_config_init.h
@@ -16,7 +16,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "playerData.h"
#include "conf.h"
#include "log.h"
#include "utils.h"
@@ -24,50 +23,65 @@
#define DEFAULT_BUFFER_SIZE 2048
#define DEFAULT_BUFFER_BEFORE_PLAY 10
-void initPlayerData(void)
+
+void config_output_buffer(void)
{
float perc = DEFAULT_BUFFER_BEFORE_PLAY;
char *test;
- size_t bufferSize = DEFAULT_BUFFER_SIZE;
- unsigned int buffered_chunks;
+ size_t buffer_size = DEFAULT_BUFFER_SIZE;
ConfigParam *param;
unsigned int buffered_before_play;
+ unsigned int buffered_chunks;
- param = getConfigParam(CONF_AUDIO_BUFFER_SIZE);
-
- if (param) {
- bufferSize = strtol(param->value, &test, 10);
- if (*test != '\0' || bufferSize <= 0) {
- FATAL("buffer size \"%s\" is not a positive integer, "
+ if ((param = getConfigParam(CONF_AUDIO_BUFFER_SIZE))) {
+ buffer_size = strtol(param->value, &test, 10);
+ if (*test != '\0' || buffer_size <= 0)
+ FATAL(CONF_AUDIO_BUFFER_SIZE
+ " \"%s\" is not a positive integer, "
"line %i\n", param->value, param->line);
- }
}
- bufferSize *= 1024;
-
- buffered_chunks = bufferSize / CHUNK_SIZE;
-
- if (buffered_chunks >= 1 << 15) {
- FATAL("buffer size \"%li\" is too big\n", (long)bufferSize);
- }
+ buffer_size *= 1024;
+ buffered_chunks = buffer_size / CHUNK_SIZE;
- param = getConfigParam(CONF_BUFFER_BEFORE_PLAY);
+ if (buffered_chunks >= 1 << 15)
+ FATAL("buffer size \"%li\" is too big\n", (long)buffer_size);
- if (param) {
+ if ((param = getConfigParam(CONF_BUFFER_BEFORE_PLAY))) {
perc = strtod(param->value, &test);
- if (*test != '%' || perc < 0 || perc > 100) {
- FATAL("buffered before play \"%s\" is not a positive "
+ if (*test != '%' || perc < 0 || perc > 100)
+ FATAL(CONF_BUFFER_BEFORE_PLAY
+ " \"%s\" is not a positive "
"percentage and less than 100 percent, line %i"
"\n", param->value, param->line);
- }
}
buffered_before_play = (perc / 100) * buffered_chunks;
- if (buffered_before_play > buffered_chunks) {
+ if (buffered_before_play > buffered_chunks)
buffered_before_play = buffered_chunks;
- }
+ ob.nr_bpp = buffered_before_play;
- ob_init(buffered_chunks);
+ assert(buffered_chunks > 0 && !ob.index && !ob.chunks);
+ ob.index = ringbuf_create(buffered_chunks);
+ ob.chunks = xcalloc(ob.index->size, sizeof(struct ob_chunk));
+ ob.preseek_len = xmalloc(ob.index->size * sizeof(ob.chunks[0].len));
+ ob.state = OB_STATE_STOP;
}
+static void ob_free(void)
+{
+ free(ob.chunks);
+ ringbuf_free(ob.index);
+}
+void init_output_buffer(void)
+{
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (pthread_create(&ob.thread, &attr, ob_task, NULL))
+ FATAL("Failed to spawn player task: %s\n", strerror(errno));
+
+ atexit(ob_free);
+}
diff --git a/src/playerData.h b/src/playerData.h
deleted file mode 100644
index ea8ea13e8..000000000
--- a/src/playerData.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* the Music Player Daemon (MPD)
- * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
- * This project's homepage is: http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef PLAYER_DATA_H
-#define PLAYER_DATA_H
-
-#include "audio.h"
-#include "decode.h"
-#include "mpd_types.h"
-#include "outputBuffer.h"
-
-void initPlayerData(void);
-
-#endif