From 953e7b09678983432c407fc22346c53915cfb525 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 1 Oct 2012 13:43:25 +0300 Subject: [PATCH] core: Fix profile cleanup when removing or disconnecting --- src/device.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/device.c b/src/device.c index efa3dbeb1..e88aaf199 100644 --- a/src/device.c +++ b/src/device.c @@ -814,6 +814,17 @@ static void bonding_request_cancel(struct bonding_req *bonding) adapter_cancel_bonding(adapter, &device->bdaddr); } +static void dev_disconn_profile(gpointer a, gpointer b) +{ + struct btd_profile *profile = a; + struct btd_device *dev = b; + + if (!profile->disconnect) + return; + + profile->disconnect(dev, profile, NULL); +} + void device_request_disconnect(struct btd_device *device, DBusMessage *msg) { if (device->bonding) @@ -831,6 +842,12 @@ void device_request_disconnect(struct btd_device *device, DBusMessage *msg) if (device->disconn_timer) return; + if (device->profiles_connected) + g_slist_foreach(device->profiles, dev_disconn_profile, device); + + g_slist_free(device->pending); + device->pending = NULL; + while (device->watches) { struct btd_disconnect_data *data = device->watches->data; @@ -1267,6 +1284,12 @@ void device_remove(struct btd_device *device, gboolean remove_stored) browse_request_cancel(device->browse); } + if (device->profiles_connected) + g_slist_foreach(device->profiles, dev_disconn_profile, device); + + g_slist_free(device->pending); + device->pending = NULL; + if (device->connected) do_disconnect(device); -- 2.47.3