OSDN Git Service

core: Fix profile cleanup when removing or disconnecting
authorJohan Hedberg <johan.hedberg@intel.com>
Mon, 1 Oct 2012 10:43:25 +0000 (13:43 +0300)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 1 Oct 2012 11:02:00 +0000 (14:02 +0300)
src/device.c

index efa3dbe..e88aaf1 100644 (file)
@@ -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);