[pulseaudio-discuss] [PATCH 2/2] tunnel-sink-new: use *_new-style for thread_mq init

Alexander Couzens lynxis at fe80.eu
Mon Sep 16 04:06:27 PDT 2013


When the creating of worker thread fails also pa_thread_mq_done() in module deinit
will fail, because pa_thread_mq_init() never called.
Using _new-style initilisation and holding a pointer to thread_mq in userdata instead
of the struct fixes this.
---
 src/modules/module-tunnel-sink-new.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/modules/module-tunnel-sink-new.c b/src/modules/module-tunnel-sink-new.c
index e0dbe91..4494a19 100644
--- a/src/modules/module-tunnel-sink-new.c
+++ b/src/modules/module-tunnel-sink-new.c
@@ -71,7 +71,7 @@ struct userdata {
     pa_module *module;
     pa_sink *sink;
     pa_thread *thread;
-    pa_thread_mq thread_mq;
+    pa_thread_mq *thread_mq;
     pa_mainloop *thread_mainloop;
     pa_mainloop_api *thread_mainloop_api;
 
@@ -126,7 +126,7 @@ static void thread_func(void *userdata) {
     pa_assert(u);
 
     pa_log_debug("Thread starting up");
-    pa_thread_mq_install(&u->thread_mq);
+    pa_thread_mq_install(u->thread_mq);
 
     proplist = tunnel_new_proplist(u);
     u->context = pa_context_new_with_proplist(u->thread_mainloop_api,
@@ -203,8 +203,8 @@ static void thread_func(void *userdata) {
         }
     }
 fail:
-    pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->module->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
-    pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
+    pa_asyncmsgq_post(u->thread_mq->outq, PA_MSGOBJECT(u->module->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
+    pa_asyncmsgq_wait_for(u->thread_mq->inq, PA_MESSAGE_SHUTDOWN);
 
 finish:
     if (u->stream) {
@@ -453,7 +453,8 @@ int pa__init(pa_module *m) {
 
     u->remote_sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
 
-    pa_thread_mq_init_thread_mainloop(&u->thread_mq, m->core->mainloop, u->thread_mainloop_api);
+    u->thread_mq = pa_xnew0(pa_thread_mq, 1);
+    pa_thread_mq_init_thread_mainloop(u->thread_mq, m->core->mainloop, u->thread_mainloop_api);
 
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
@@ -491,7 +492,7 @@ int pa__init(pa_module *m) {
     u->sink->update_requested_latency = sink_update_requested_latency_cb;
 
     /* set thread message queue */
-    pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
+    pa_sink_set_asyncmsgq(u->sink, u->thread_mq->inq);
 
     if (!(u->thread = pa_thread_new("tunnel-sink", thread_func, u))) {
         pa_log("Failed to create thread.");
@@ -528,11 +529,14 @@ void pa__done(pa_module *m) {
         pa_sink_unlink(u->sink);
 
     if (u->thread) {
-        pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
+        pa_asyncmsgq_send(u->thread_mq->inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
         pa_thread_free(u->thread);
     }
 
-    pa_thread_mq_done(&u->thread_mq);
+    if (u->thread_mq) {
+        pa_thread_mq_done(u->thread_mq);
+        pa_xfree(u->thread);
+    }
 
     if (u->thread_mainloop)
         pa_mainloop_free(u->thread_mainloop);
-- 
1.8.4



More information about the pulseaudio-discuss mailing list