]> code.delx.au - pulseaudio/blobdiff - src/modules/module-zeroconf-publish.c
zeroconf-publish: Add locking around pa_mainloop_api_once()
[pulseaudio] / src / modules / module-zeroconf-publish.c
index 3350008e1939a89cd18082fce382720ea8b4c755..35277c2d22698087eef805c86b67d5913e8712ed 100644 (file)
@@ -745,7 +745,7 @@ int pa__init(pa_module*m) {
 
     u->avahi_poll = pa_avahi_poll_new(u->api);
 
-    u->services = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    u->services = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, (pa_free_cb_t) service_free);
 
     u->sink_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u);
     u->sink_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u);
@@ -786,7 +786,7 @@ fail:
 static void client_free(pa_mainloop_api *api PA_GCC_UNUSED, void *userdata) {
     struct userdata *u = (struct userdata *) userdata;
 
-    pa_hashmap_free(u->services, (pa_free_cb_t) service_free);
+    pa_hashmap_free(u->services);
 
     if (u->main_entry_group)
         avahi_entry_group_free(u->main_entry_group);
@@ -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);