diff --git a/src/advertising.c b/src/advertising.c
index e5cd31c..ef84e45 100644
--- a/src/advertising.c
+++ b/src/advertising.c
g_dbus_client_unref(ad->client);
}
+ if (ad->instance)
+ util_clear_uid(&ad->manager->instance_bitmap, ad->instance);
+
bt_ad_unref(ad->data);
g_dbus_proxy_unref(ad->proxy);
queue_remove(ad->manager->ads, ad);
- util_clear_uid(&ad->manager->instance_bitmap, ad->instance);
-
g_idle_add(advertisement_free_idle_cb, ad);
}
ad->reg = NULL;
}
-static struct advertisement *advertisement_create(DBusConnection *conn,
+static struct advertisement *
+advertisement_create(struct btd_advertising *manager, DBusConnection *conn,
DBusMessage *msg, const char *path)
{
struct advertisement *ad;
if (!ad->data)
goto fail;
+ ad->instance = util_get_uid(&manager->instance_bitmap,
+ manager->max_ads);
+ if (!ad->instance)
+ goto fail;
+
+ ad->manager = manager;
+
return ad;
fail:
DBusMessageIter args;
struct advertisement *ad;
struct dbus_obj_match match;
- uint8_t instance;
DBG("RegisterAdvertisement");
if (queue_find(manager->ads, match_advertisement, &match))
return btd_error_already_exists(msg);
- instance = util_get_uid(&manager->instance_bitmap, manager->max_ads);
- if (!instance)
- return btd_error_failed(msg, "Maximum advertisements reached");
-
dbus_message_iter_next(&args);
if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_ARRAY)
return btd_error_invalid_args(msg);
- ad = advertisement_create(conn, msg, match.path);
+ ad = advertisement_create(manager, conn, msg, match.path);
if (!ad)
return btd_error_failed(msg,
"Failed to register advertisement");
DBG("Registered advertisement at path %s", match.path);
- ad->instance = instance;
- ad->manager = manager;
-
queue_push_tail(manager->ads, ad);
return NULL;