From: Andre Noll Date: Sat, 6 Aug 2011 19:44:24 +0000 (+0200) Subject: audiod: Fix memory leak in writer setup. X-Git-Tag: v0.4.8~4^2~5 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=3ac4dd80b465b07c5eb8b8b5200ab67ca948d8f1 audiod: Fix memory leak in writer setup. If no writers are given, the default writer is used for each supported audio format. In this case, we called the writer's command line parser on each open, rather than once at startup as we fo for the non-default case. This resulted in a memory leak which is fixed in this patch by setting up the default writer only once, in the same way the default receivers and filters are set up. --- diff --git a/audiod.c b/audiod.c index c7998cdb..74aa3865 100644 --- a/audiod.c +++ b/audiod.c @@ -522,16 +522,12 @@ static void open_writers(struct slot_info *s) assert(s->wns == NULL); s->wns = para_calloc(PARA_MAX(1U, a->num_writers) * sizeof(struct writer_node)); - if (a->num_writers == 0) - setup_writer_node(NULL, parent, s->wns); - else { - PARA_INFO_LOG("opening %s writers\n", audio_formats[s->format]); - for (i = 0; i < a->num_writers; i++) { - wn = s->wns + i; - wn->conf = a->writer_conf[i]; - wn->writer_num = a->writer_nums[i]; - register_writer_node(wn, parent); - } + PARA_INFO_LOG("opening %s writers\n", audio_formats[s->format]); + for (i = 0; i < a->num_writers; i++) { + wn = s->wns + i; + wn->conf = a->writer_conf[i]; + wn->writer_num = a->writer_nums[i]; + register_writer_node(wn, parent); } } @@ -800,6 +796,20 @@ static int parse_writer_args(void) a->num_writers++; } } + /* Use default writer for audio formats which are not yet set up. */ + FOR_EACH_AUDIO_FORMAT(i) { + struct writer *w = writers + DEFAULT_WRITER; + a = afi + i; + if (a->num_writers > 0) + continue; /* already set up */ + PARA_INFO_LOG("%s writer: %s (default)\n", audio_formats[i], + writer_names[DEFAULT_WRITER]); + a->writer_nums = para_malloc(sizeof(int)); + a->writer_nums[0] = DEFAULT_WRITER; + a->writer_conf = para_malloc(sizeof(void *)); + a->writer_conf[0] = w->parse_config_or_die(""); + a->num_writers = 1; + } ret = 1; out: return ret;