[pulseaudio-discuss] [PATCH v1 18/18] bluetooth-experimental: Fix race condition using accesstype "?"
Mikel Astiz
mikel.astiz.oss at gmail.com
Mon Aug 27 08:24:13 PDT 2012
From: Mikel Astiz <mikel.astiz at bmw-carit.de>
BlueZ now supports a flag in the accesstype in order to avoid the race
condition between the state-test (state should be "Playing") and the
call to Acquire(). This fixes the previously existing race condition
during profile change.
---
src/modules/bluetooth/module-bluetooth-device.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 3b94f00..fd858c7 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -306,7 +306,6 @@ static void bt_transport_close_stream(struct userdata *u) {
}
static void bt_transport_release(struct userdata *u) {
- const char *accesstype = "rw";
const pa_bluetooth_transport *t;
/* Ignore if already released */
@@ -317,7 +316,7 @@ static void bt_transport_release(struct userdata *u) {
t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
if (t)
- pa_bluetooth_transport_release(t, accesstype);
+ pa_bluetooth_transport_release(t, u->accesstype);
pa_xfree(u->accesstype);
u->accesstype = NULL;
@@ -348,7 +347,7 @@ static pa_bt_audio_state_t get_profile_audio_state(const struct userdata *u, con
}
static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
- const char *accesstype = "rw";
+ const char *accesstype = start ? "rw" : "rw?";
const pa_bluetooth_device *d;
const pa_bluetooth_transport *t;
@@ -375,13 +374,13 @@ static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
}
if (!start) {
- /* FIXME: we are trying to acquire the transport only if the stream is
+ /* We are trying to acquire the transport only if the stream is
playing, without actually initiating the stream request from our side
(which is typically undesireable specially for hfgw use-cases.
- However this approach is racy, since the stream could have been
- suspended in the meantime, so we can't really guarantee that the
- stream will not be requested until BlueZ's API supports this
- atomically. */
+ However this approach is racy unless at least BlueZ version 4.xxx is
+ being used, where the "?" accesstype is supported. The reason is that
+ the stream could have been suspended just before our call to
+ Acquire() */
if (get_profile_audio_state(u, d) < PA_BT_AUDIO_STATE_PLAYING) {
pa_log_info("Failed optional acquire of transport %s", u->transport);
return -1;
--
1.7.7.6
More information about the pulseaudio-discuss
mailing list