[pulseaudio-commits] 2 commits - src/modules

Tanu Kaskinen tanuk at kemper.freedesktop.org
Mon Mar 24 00:28:40 PDT 2014


 src/modules/module-zeroconf-publish.c |   17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

New commits:
commit 37e73e10be9e42544a4cc160ff85ccada2cc9aa9
Author: Tanu Kaskinen <tanu.kaskinen at linux.intel.com>
Date:   Sat Mar 15 09:37:06 2014 +0200

    zeroconf-publish: Don't react to messages while shutting down
    
    This fixes a case where pa__done() is called while
    AVAHI_MESSAGE_PUBLISH_ALL is waiting for processing. The
    pa_asyncmsgq_wait_for(AVAHI_MESSAGE_SHUTDOWN_COMPLETE) call will
    process all pending messages, and processing AVAHI_MESSAGE_PUBLISH_ALL
    causes publish_all_services(), and that in turn accesses u->services,
    which has been already freed at this point. If we are shutting down,
    we shouldn't react to any of the messages that the Avahi thread is
    sending to the main thread.
    
    BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=76184

diff --git a/src/modules/module-zeroconf-publish.c b/src/modules/module-zeroconf-publish.c
index 35277c2..db92850 100644
--- a/src/modules/module-zeroconf-publish.c
+++ b/src/modules/module-zeroconf-publish.c
@@ -141,6 +141,8 @@ struct userdata {
     pa_hook_slot *sink_new_slot, *source_new_slot, *sink_unlink_slot, *source_unlink_slot, *sink_changed_slot, *source_changed_slot;
 
     pa_native_protocol *native;
+
+    bool shutting_down;
 };
 
 /* Runs in PA mainloop context */
@@ -638,6 +640,11 @@ static void unpublish_all_services(struct userdata *u, bool rem) {
 static int avahi_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
     struct userdata *u = (struct userdata *) data;
 
+    pa_assert(u);
+
+    if (u->shutting_down)
+        return 0;
+
     switch (code) {
         case AVAHI_MESSAGE_PUBLISH_ALL:
             publish_all_services(u);
@@ -647,10 +654,6 @@ static int avahi_process_msg(pa_msgobject *o, int code, void *data, int64_t offs
             pa_module_unload(u->core, u->module, true);
             break;
 
-        case AVAHI_MESSAGE_SHUTDOWN_COMPLETE:
-            /* pa__done() is waiting for this */
-            break;
-
         default:
             pa_assert_not_reached();
     }
@@ -797,7 +800,7 @@ static void client_free(pa_mainloop_api *api PA_GCC_UNUSED, void *userdata) {
     if (u->avahi_poll)
         pa_avahi_poll_free(u->avahi_poll);
 
-    pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->msg), AVAHI_MESSAGE_SHUTDOWN_COMPLETE, NULL, 0, NULL, NULL);
+    pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->msg), AVAHI_MESSAGE_SHUTDOWN_COMPLETE, u, 0, NULL, NULL);
 }
 
 void pa__done(pa_module*m) {
@@ -807,6 +810,8 @@ void pa__done(pa_module*m) {
     if (!(u = m->userdata))
         return;
 
+    u->shutting_down = true;
+
     pa_threaded_mainloop_lock(u->mainloop);
     pa_mainloop_api_once(u->api, client_free, u);
     pa_threaded_mainloop_unlock(u->mainloop);

commit d03ffdccdb7286021e53876ba5d4adf9a1edd0d0
Author: Tanu Kaskinen <tanu.kaskinen at linux.intel.com>
Date:   Sat Mar 15 09:37:05 2014 +0200

    zeroconf-publish: Add locking around pa_mainloop_api_once()
    
    Commit e1e154c7377779377fa1a36655a10effd693f7b5 added locking around
    pa_mainloop_api_once() everywhere except pa__done(). This fixes that
    omission.

diff --git a/src/modules/module-zeroconf-publish.c b/src/modules/module-zeroconf-publish.c
index 0110e1d..35277c2 100644
--- a/src/modules/module-zeroconf-publish.c
+++ b/src/modules/module-zeroconf-publish.c
@@ -807,7 +807,9 @@ void pa__done(pa_module*m) {
     if (!(u = m->userdata))
         return;
 
+    pa_threaded_mainloop_lock(u->mainloop);
     pa_mainloop_api_once(u->api, client_free, u);
+    pa_threaded_mainloop_unlock(u->mainloop);
     pa_asyncmsgq_wait_for(u->thread_mq.outq, AVAHI_MESSAGE_SHUTDOWN_COMPLETE);
 
     pa_threaded_mainloop_stop(u->mainloop);



More information about the pulseaudio-commits mailing list