From 9bb331f2d5e63b2466647d11f5fc8b6685649cab Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 10 Nov 2017 13:42:59 +0200 Subject: [PATCH] avdtp: Fix disconnecting before stream setup completes This is a regression introduced by 7ece89b0b6f1ef8b4d4ca132a5163c08a14c41e2 which cause the disconnection to happen immediatelly when the last reference is droppped but since the stream setup may have been started by the remove end there is a chance a stream is currently ongoing in which case the previous behavior of not disconnecting immediatelly is required in order to give time for the end to complete any pending request. --- profiles/audio/avdtp.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c index a7caccb9f..2cb3c8a00 100644 --- a/profiles/audio/avdtp.c +++ b/profiles/audio/avdtp.c @@ -1002,6 +1002,7 @@ static void avdtp_sep_set_state(struct avdtp *session, handle_unanswered_req(session, stream); /* Remove pending commands for this stream from the queue */ cleanup_queue(session, stream); + session->streams = g_slist_remove(session->streams, stream); break; default: break; @@ -1014,11 +1015,8 @@ static void avdtp_sep_set_state(struct avdtp *session, cb->cb(stream, old_state, state, err_ptr, cb->user_data); } - if (state == AVDTP_STATE_IDLE && - g_slist_find(session->streams, stream)) { - session->streams = g_slist_remove(session->streams, stream); + if (state == AVDTP_STATE_IDLE) stream_free(stream); - } } static void finalize_discovery(struct avdtp *session, int err) @@ -1154,7 +1152,7 @@ static void set_disconnect_timer(struct avdtp *session) if (session->dc_timer) remove_disconnect_timer(session); - if (!session->stream_setup) + if (!session->stream_setup && !session->streams) session->dc_timer = g_idle_add(disconnect_timeout, session); else session->dc_timer = g_timeout_add_seconds(DISCONNECT_TIMEOUT, -- 2.47.3