diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-03-13 15:51:49 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-03-14 12:38:19 -0700 |
commit | 4b704fb45a69ed6e745c5d01cca9622ede4bf522 (patch) | |
tree | 3a09d058c0f6c8881b623cb7ae25084c284e7361 /src | |
parent | 605ee768b789602f59f298423dfbad780deeeb8c (diff) | |
download | bluez-4b704fb45a69ed6e745c5d01cca9622ede4bf522.tar.gz |
shared/gatt-client: Introduce bt_gatt_client_ref_safe
This introduces bt_gatt_client_ref_save which ensures the instaces
which are being destroyed, e.g. ref_count = 0, do not attempt to reach
callbacks.
Diffstat (limited to 'src')
-rw-r--r-- | src/shared/gatt-client.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c index f88507691..f0499cc0e 100644 --- a/src/shared/gatt-client.c +++ b/src/shared/gatt-client.c @@ -173,9 +173,20 @@ static bool idle_notify(const void *data, const void *user_data) return true; } +static struct bt_gatt_client * +bt_gatt_client_ref_safe(struct bt_gatt_client *client) +{ + if (!client || !client->ref_count) + return NULL; + + return bt_gatt_client_ref(client); +} + static void notify_client_idle(struct bt_gatt_client *client) { - bt_gatt_client_ref(client); + client = bt_gatt_client_ref_safe(client); + if (!client) + return; queue_remove_all(client->idle_cbs, idle_notify, NULL, idle_destroy); @@ -1360,10 +1371,13 @@ static void notify_client_ready(struct bt_gatt_client *client, bool success, { const struct queue_entry *entry; - if (client->ready) + client = bt_gatt_client_ref_safe(client); + if (!client) return; - bt_gatt_client_ref(client); + if (client->ready) + goto done; + client->ready = success; if (client->parent) @@ -1386,6 +1400,7 @@ static void notify_client_ready(struct bt_gatt_client *client, bool success, notify_client_ready(clone, success, att_ecode); } +done: bt_gatt_client_unref(client); } |