static void remove_disconnect_timer(struct avdtp *session)
{
+ if (!session->dc_timer)
+ return;
+
g_source_remove(session->dc_timer);
session->dc_timer = 0;
session->stream_setup = FALSE;
+
+ /* Release disconnect timer reference */
+ avdtp_unref(session);
}
static void avdtp_free(void *data)
session->io_id = 0;
}
- if (session->dc_timer)
- remove_disconnect_timer(session);
-
if (session->req)
pending_req_free(session->req);
service = btd_device_get_service(session->device, A2DP_SINK_UUID);
if (service && stream_setup) {
sink_setup_stream(service, session);
- return FALSE;
+ goto done;
}
service = btd_device_get_service(session->device, A2DP_SOURCE_UUID);
if (service && stream_setup) {
source_setup_stream(service, session);
- return FALSE;
+ goto done;
}
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
connection_lost(session, ETIMEDOUT);
+done:
+ /* Release disconnect timer reference */
+ avdtp_unref(session);
+
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
if (device)
g_timeout_add(100,
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
char name[6];
#endif
- if (session->dc_timer)
- remove_disconnect_timer(session);
+ /* Take a ref while disconnect timer is active */
+ avdtp_ref(session);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
device_get_name(session->device, name, sizeof(name));
{
session->ref++;
DBG("%p: ref=%d", session, session->ref);
- if (session->dc_timer)
- remove_disconnect_timer(session);
+ remove_disconnect_timer(session);
return session;
}