]> code.delx.au - pulseaudio/commitdiff
bluetooth: Fix thread teardown code ordering
authorTanu Kaskinen <tanuk@iki.fi>
Tue, 12 Feb 2013 19:37:02 +0000 (21:37 +0200)
committerTanu Kaskinen <tanuk@iki.fi>
Sat, 16 Feb 2013 18:48:55 +0000 (20:48 +0200)
thread_mq.outq may contain some unprocessed messages, which should be
dispatched before unreffing the sink and source. If the sink and
source are unreffed before all messages to them have been dispatched,
the unreffing won't free the sink and source, and that in turn will
likely cause problems with things getting freed in a wrong order.

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

index 25a21821e27b812a1f7b6053e1822564c095fdc9..776bcbae421b75cf84742933473b39ecc71bc250 100644 (file)
@@ -1954,6 +1954,13 @@ static void stop_thread(struct userdata *u) {
         u->rtpoll_item = NULL;
     }
 
+    if (u->rtpoll) {
+        pa_thread_mq_done(&u->thread_mq);
+
+        pa_rtpoll_free(u->rtpoll);
+        u->rtpoll = NULL;
+    }
+
     if (u->transport) {
         bt_transport_release(u);
         u->transport = NULL;
@@ -1981,13 +1988,6 @@ static void stop_thread(struct userdata *u) {
         u->source = NULL;
     }
 
-    if (u->rtpoll) {
-        pa_thread_mq_done(&u->thread_mq);
-
-        pa_rtpoll_free(u->rtpoll);
-        u->rtpoll = NULL;
-    }
-
     if (u->read_smoother) {
         pa_smoother_free(u->read_smoother);
         u->read_smoother = NULL;