From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> If the device is removed locally device_free would end up calling bt_att_unref which won't trigger any disconnect callback necessary to remove device states. --- src/device.c | 3 +++ src/gatt-database.c | 24 ++++++++++++++++++++++++ src/gatt-database.h | 2 ++ 3 files changed, 29 insertions(+) diff --git a/src/device.c b/src/device.c index ef5b8f86a..5ddfb9266 100644 --- a/src/device.c +++ b/src/device.c @@ -580,6 +580,9 @@ static void gatt_server_cleanup(struct btd_device *device) bt_gatt_server_unref(device->server); device->server = NULL; + + btd_gatt_database_att_disconnected( + btd_adapter_get_database(device->adapter), device->att); } static void attio_cleanup(struct btd_device *device) diff --git a/src/gatt-database.c b/src/gatt-database.c index abcf7b759..bdabcb4d6 100644 --- a/src/gatt-database.c +++ b/src/gatt-database.c @@ -3349,6 +3349,30 @@ void btd_gatt_database_att_connected(struct btd_gatt_database *database, state->pending = NULL; } +void btd_gatt_database_att_disconnected(struct btd_gatt_database *database, + struct bt_att *att) +{ + struct device_state *state; + bdaddr_t bdaddr; + uint8_t bdaddr_type; + + DBG(""); + + if (!get_dst_info(att, &bdaddr, &bdaddr_type)) + return; + + state = find_device_state(database, &bdaddr, bdaddr_type); + if (!state) + return; + + if (state->disc_id) { + bt_att_unregister_disconnect(att, state->disc_id); + state->disc_id = 0; + } + + att_disconnected(0, state); +} + static void restore_ccc(struct btd_gatt_database *database, const bdaddr_t *addr, uint8_t addr_type, uint16_t value) { diff --git a/src/gatt-database.h b/src/gatt-database.h index a6c3139c4..9e7cda8c2 100644 --- a/src/gatt-database.h +++ b/src/gatt-database.h @@ -25,5 +25,7 @@ void btd_gatt_database_destroy(struct btd_gatt_database *database); struct gatt_db *btd_gatt_database_get_db(struct btd_gatt_database *database); void btd_gatt_database_att_connected(struct btd_gatt_database *database, struct bt_att *att); +void btd_gatt_database_att_disconnected(struct btd_gatt_database *database, + struct bt_att *att); void btd_gatt_database_restore_svc_chng_ccc(struct btd_gatt_database *database); -- 2.17.1