diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
index e86c07f..f7a90d1 100644
--- a/src/shared/gatt-client.c
+++ b/src/shared/gatt-client.c
op->complete_func(op, success, att_ecode);
}
+static void notify_client_ready(struct bt_gatt_client *client, bool success,
+ uint8_t att_ecode)
+{
+ if (!client->ready_callback)
+ return;
+
+ bt_gatt_client_ref(client);
+ client->ready_callback(success, att_ecode, client->ready_data);
+ bt_gatt_client_unref(client);
+}
+
static void exchange_mtu_cb(bool success, uint8_t att_ecode, void *user_data)
{
struct discovery_op *op = user_data;
att_ecode);
client->in_init = false;
-
- if (client->ready_callback)
- client->ready_callback(success, att_ecode,
- client->ready_data);
+ notify_client_ready(client, success, att_ecode);
return;
}
"Failed to initiate primary service discovery");
client->in_init = false;
-
- if (client->ready_callback)
- client->ready_callback(false, att_ecode, client->ready_data);
+ notify_client_ready(client, false, att_ecode);
discovery_op_unref(op);
}
"Registered handler for \"Service Changed\": %u", id);
done:
- if (client->ready_callback)
- client->ready_callback(success, att_ecode, client->ready_data);
+ notify_client_ready(client, success, att_ecode);
}
static void init_complete(struct discovery_op *op, bool success,
op->success = false;
done:
- if (client->ready_callback)
- client->ready_callback(success, att_ecode, client->ready_data);
+ notify_client_ready(client, success, att_ecode);
}
static void init_fail(struct discovery_op *op)
}
/* Success! Report success for all remaining requests. */
+ bt_gatt_client_ref(notify_data->client);
+
complete_notify_request(notify_data);
queue_remove_all(notify_data->chrc->reg_notify_queue, NULL, NULL,
complete_notify_request);
+
+ bt_gatt_client_unref(notify_data->client);
}
static void disable_ccc_callback(uint8_t opcode, const void *pdu,
client->in_init = false;
client->ready = false;
- if (in_init && client->ready_callback)
- client->ready_callback(false, 0, client->ready_data);
+ if (in_init)
+ notify_client_ready(client, false, 0);
}
struct bt_gatt_client *bt_gatt_client_new(struct gatt_db *db,