[PATCH v2 6/9] bluetooth: Set to off if transport removed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx>

The recently added hook can be used to detect that the transport being
used has been removed. In this case, the profile needs to be set to off.

Additionally, the change fixes a significant problem: without this
transition, the transport could be destroyed while the hook slots (i.e.
nrec_changed_slot) were still set. This led to a double free of these
objects in stop_thread().
---
 src/modules/bluetooth/module-bluetooth-device.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index b56cb77..8b14c61 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -143,6 +143,7 @@ struct userdata {
     char *path;
     char *transport;
     char *accesstype;
+    pa_hook_slot *transport_removed_slot;
 
     pa_bluetooth_discovery *discovery;
     pa_bool_t auto_connect;
@@ -1975,6 +1976,16 @@ static void bt_transport_config(struct userdata *u) {
 }
 
 /* Run from main thread */
+static pa_hook_result_t transport_removed_cb(pa_bluetooth_transport *t, void *call_data, struct userdata *u) {
+    pa_assert(t);
+    pa_assert(u);
+
+    pa_assert_se(pa_card_set_profile(u->card, "off", false) >= 0);
+
+    return PA_HOOK_OK;
+}
+
+/* Run from main thread */
 static int setup_transport(struct userdata *u) {
     const pa_bluetooth_device *d;
     pa_bluetooth_transport *t;
@@ -1995,6 +2006,9 @@ static int setup_transport(struct userdata *u) {
 
     u->transport = pa_xstrdup(t->path);
 
+    u->transport_removed_slot = pa_hook_connect(&t->hooks[PA_BLUETOOTH_TRANSPORT_HOOK_REMOVED], PA_HOOK_NORMAL,
+                                                (pa_hook_cb_t) transport_removed_cb, u);
+
     bt_transport_acquire(u, FALSE);
 
     bt_transport_config(u);
@@ -2064,6 +2078,11 @@ static void stop_thread(struct userdata *u) {
         u->hsp.nrec_changed_slot = NULL;
     }
 
+    if (u->transport_removed_slot) {
+        pa_hook_slot_free(u->transport_removed_slot);
+        u->transport_removed_slot = NULL;
+    }
+
     if (u->transport) {
         bt_transport_release(u);
         pa_xfree(u->transport);
-- 
1.7.11.7



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux