]> code.delx.au - pulseaudio/commitdiff
bluetooth: Track discovery modules by index
authorJoão Paulo Rechi Vita <jprvita@gmail.com>
Mon, 14 Oct 2013 19:18:03 +0000 (16:18 -0300)
committerTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Tue, 15 Oct 2013 07:42:25 +0000 (10:42 +0300)
Previously module-bluez5-discover and module-bluez4-discover were being
tracked using their pa_module pointer. But during daemon shutdown these
modules are unloaded before module-bluetooth-discover, leaving stale
pointers in module-bluetooth-discover's userdata. To avoid this problem
this commit makes module-bluetooth-discover keep track of
module-bluez5-discover and module-bluez4-discovery by their indexes.

src/modules/bluetooth/module-bluetooth-discover.c

index c4fb26ade6dbf2b8ab2f133aa486f1c2f87c6755..0bcfcf99d62463acb4229ac4dee4261b1f515135 100644 (file)
@@ -35,24 +35,33 @@ PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(true);
 
 struct userdata {
-    pa_module *bluez5_module;
-    pa_module *bluez4_module;
+    uint32_t bluez5_module_idx;
+    uint32_t bluez4_module_idx;
 };
 
 int pa__init(pa_module* m) {
     struct userdata *u;
+    pa_module *mm;
 
     pa_assert(m);
 
     m->userdata = u = pa_xnew0(struct userdata, 1);
+    u->bluez5_module_idx = PA_INVALID_INDEX;
+    u->bluez4_module_idx = PA_INVALID_INDEX;
 
-    if (pa_module_exists("module-bluez5-discover"))
-        u->bluez5_module = pa_module_load(m->core, "module-bluez5-discover",  NULL);
+    if (pa_module_exists("module-bluez5-discover")) {
+        mm = pa_module_load(m->core, "module-bluez5-discover",  NULL);
+        if (mm)
+            u->bluez5_module_idx = mm->index;
+    }
 
-    if (pa_module_exists("module-bluez4-discover"))
-        u->bluez4_module = pa_module_load(m->core, "module-bluez4-discover",  NULL);
+    if (pa_module_exists("module-bluez4-discover")) {
+        mm = pa_module_load(m->core, "module-bluez4-discover",  NULL);
+        if (mm)
+            u->bluez4_module_idx = mm->index;
+    }
 
-    if (!u->bluez5_module && !u->bluez4_module) {
+    if (u->bluez5_module_idx == PA_INVALID_INDEX && u->bluez4_module_idx == PA_INVALID_INDEX) {
         pa_xfree(u);
         return -1;
     }
@@ -68,11 +77,11 @@ void pa__done(pa_module* m) {
     if (!(u = m->userdata))
         return;
 
-    if (u->bluez5_module)
-        pa_module_unload(m->core, u->bluez5_module, true);
+    if (u->bluez5_module_idx != PA_INVALID_INDEX)
+        pa_module_unload_by_index(m->core, u->bluez5_module_idx, true);
 
-    if (u->bluez4_module)
-        pa_module_unload(m->core, u->bluez4_module, true);
+    if (u->bluez4_module_idx != PA_INVALID_INDEX)
+        pa_module_unload_by_index(m->core, u->bluez4_module_idx, true);
 
     pa_xfree(u);
 }