@@ -1232,7 +1232,7 @@ static void hog_free(void *data)
{
struct bt_hog *hog = data;
- bt_hog_detach(hog);
+ bt_hog_detach(hog, true);
uhid_destroy(hog);
queue_destroy(hog->bas, (void *) bt_bas_unref);
@@ -1747,7 +1747,7 @@ bool bt_hog_attach(struct bt_hog *hog, void *gatt)
return true;
}
-void bt_hog_detach(struct bt_hog *hog)
+void bt_hog_detach(struct bt_hog *hog, bool force)
{
GSList *l;
@@ -1759,7 +1759,7 @@ void bt_hog_detach(struct bt_hog *hog)
for (l = hog->instances; l; l = l->next) {
struct bt_hog *instance = l->data;
- bt_hog_detach(instance);
+ bt_hog_detach(instance, force);
}
for (l = hog->reports; l; l = l->next) {
@@ -1780,6 +1780,9 @@ void bt_hog_detach(struct bt_hog *hog)
queue_remove_all(hog->gatt_op, cancel_gatt_req, hog, destroy_gatt_req);
g_attrib_unref(hog->attrib);
hog->attrib = NULL;
+
+ if (force)
+ uhid_destroy(hog);
}
int bt_hog_set_control_point(struct bt_hog *hog, bool suspend)
@@ -22,7 +22,7 @@ struct bt_hog *bt_hog_ref(struct bt_hog *hog);
void bt_hog_unref(struct bt_hog *hog);
bool bt_hog_attach(struct bt_hog *hog, void *gatt);
-void bt_hog_detach(struct bt_hog *hog);
+void bt_hog_detach(struct bt_hog *hog, bool force);
int bt_hog_set_control_point(struct bt_hog *hog, bool suspend);
int bt_hog_send_report(struct bt_hog *hog, void *data, size_t size, int type);
@@ -206,7 +206,7 @@ static int hog_disconnect(struct btd_service *service)
{
struct hog_device *dev = btd_service_get_user_data(service);
- bt_hog_detach(dev->hog);
+ bt_hog_detach(dev->hog, false);
btd_service_disconnecting_complete(service, 0);
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> This adds force parameter to bt_hog_detach which indicates if the bt_uhid_destroy shall be called. --- profiles/input/hog-lib.c | 9 ++++++--- profiles/input/hog-lib.h | 2 +- profiles/input/hog.c | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-)