diff --git a/android/gatt.c b/android/gatt.c
index b9b3c7b..7d1115e 100644
--- a/android/gatt.c
+++ b/android/gatt.c
queue_destroy(services_sdp, NULL);
services_sdp = NULL;
- gatt_db_destroy(gatt_db);
+ gatt_db_unref(gatt_db);
gatt_db = NULL;
bt_crypto_unref(crypto);
queue_destroy(listen_apps, NULL);
listen_apps = NULL;
- gatt_db_destroy(gatt_db);
+ gatt_db_unref(gatt_db);
gatt_db = NULL;
g_io_channel_unref(le_io);
diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
index 754d45f..b10db4a 100644
--- a/src/shared/gatt-db.c
+++ b/src/shared/gatt-db.c
.value.u16 = GATT_INCLUDE_UUID };
struct gatt_db {
+ int ref_count;
uint16_t next_handle;
struct queue *services;
};
return NULL;
}
+struct gatt_db *gatt_db_ref(struct gatt_db *db)
+{
+ if (!db)
+ return NULL;
+
+ __sync_fetch_and_add(&db->ref_count, 1);
+
+ return db;
+}
+
struct gatt_db *gatt_db_new(void)
{
struct gatt_db *db;
db->next_handle = 0x0001;
- return db;
+ return gatt_db_ref(db);
}
static void gatt_db_service_destroy(void *data)
free(service);
}
-void gatt_db_destroy(struct gatt_db *db)
+static void gatt_db_destroy(struct gatt_db *db)
{
if (!db)
return;
free(db);
}
+void gatt_db_unref(struct gatt_db *db)
+{
+ if (!db)
+ return;
+
+ if (__sync_sub_and_fetch(&db->ref_count, 1))
+ return;
+
+ gatt_db_destroy(db);
+}
+
static int uuid_to_le(const bt_uuid_t *uuid, uint8_t *dst)
{
bt_uuid_t uuid128;
diff --git a/src/shared/gatt-db.h b/src/shared/gatt-db.h
index ea9f2dc..7018b14 100644
--- a/src/shared/gatt-db.h
+++ b/src/shared/gatt-db.h
struct gatt_db_attribute;
struct gatt_db *gatt_db_new(void);
-void gatt_db_destroy(struct gatt_db *db);
+
+struct gatt_db *gatt_db_ref(struct gatt_db *db);
+void gatt_db_unref(struct gatt_db *db);
struct gatt_db_attribute *gatt_db_add_service(struct gatt_db *db,
const bt_uuid_t *uuid,
diff --git a/tools/btgatt-server.c b/tools/btgatt-server.c
index c603b30..87b8067 100644
--- a/tools/btgatt-server.c
+++ b/tools/btgatt-server.c
return server;
fail:
- gatt_db_destroy(server->db);
+ gatt_db_unref(server->db);
free(server->device_name);
bt_att_unref(att);
free(server);
{
timeout_remove(server->hr_timeout_id);
bt_gatt_server_unref(server->gatt);
- gatt_db_destroy(server->db);
+ gatt_db_unref(server->db);
}
static void usage(void)
diff --git a/unit/test-gatt.c b/unit/test-gatt.c
index 703430c..03a66b9 100644
--- a/unit/test-gatt.c
+++ b/unit/test-gatt.c
bt_gatt_client_unref(context->client);
bt_gatt_server_unref(context->server);
- gatt_db_destroy(context->db);
+ gatt_db_unref(context->db);
if (context->att)
bt_att_unref(context->att);