Diff between 14460ad72f9c1ba11d706928c2b617bb915a3d22 and 953e7b09678983432c407fc22346c53915cfb525

Changed Files

File Additions Deletions Status
src/device.c +23 -0 modified

Full Patch

diff --git a/src/device.c b/src/device.c
index efa3dbe..e88aaf1 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);