]> code.delx.au - pulseaudio/commitdiff
core: Unload the modules and cached samples before unref'ing the core.
authorColin Guthrie <colin@mageia.org>
Tue, 16 Aug 2011 09:54:24 +0000 (10:54 +0100)
committerColin Guthrie <colin@mageia.org>
Tue, 16 Aug 2011 10:01:34 +0000 (11:01 +0100)
As various modules can subscribe to unlink callbacks unloading some modules
may trigger hooks in other modules.

The callbacks associated with these hooks could in turn need to use the core
in some capacity (e.g. perhaps they are module loading modules
(e.g. *-discover, filter-apply or gconf etc. and need to use the core to
unload modules they've loaded).

This change simply ensures that all modules and cached samples are unloaded
before freeing the core.

src/daemon/main.c
src/pulsecore/core.c

index 55726fdbe8978347ae5bbbe9e70aeec4c679fafb..1d0a65e384c2adb155eac0e7e0128b14096341f6 100644 (file)
@@ -1156,6 +1156,11 @@ finish:
 #endif
 
     if (c) {
+        /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
+         * as unlink callback hooks in modules may need the core to be ref'ed */
+        pa_module_unload_all(c);
+        pa_scache_free_all(c);
+
         pa_core_unref(c);
         pa_log_info(_("Daemon terminated."));
     }
index 2a68fdf474fd7de213d0ab05f116efcbdcb63e8a..0e53b9d989493923018570e05e07bf26019dce55 100644 (file)
@@ -166,8 +166,8 @@ static void core_free(pa_object *o) {
 
     c->state = PA_CORE_SHUTDOWN;
 
-    pa_module_unload_all(c);
-    pa_scache_free_all(c);
+    /* Note: All modules and samples in the cache should be unloaded before
+     * we get here */
 
     pa_assert(pa_idxset_isempty(c->scache));
     pa_idxset_free(c->scache, NULL, NULL);