#include "common/jhash.h"
#include "context-provider-internal.h"
#include "common/macros.h"
+#include "common/tracer.h"
struct lttng_ust_registered_context_provider {
const struct lttng_ust_context_provider *provider;
struct cds_hlist_node node;
};
-struct lttng_ust_app_ctx {
- char *name;
- struct lttng_ust_event_field *event_field;
- struct lttng_ust_type_common *type;
-};
-
#define CONTEXT_PROVIDER_HT_BITS 12
#define CONTEXT_PROVIDER_HT_SIZE (1U << CONTEXT_PROVIDER_HT_BITS)
struct context_provider_ht {
size_t name_len = strlen(provider->name);
uint32_t hash;
- lttng_ust_fixup_tls();
+ lttng_ust_common_init_thread(0);
/* Provider name starts with "$app.". */
if (strncmp("$app.", provider->name, strlen("$app.")) != 0)
lttng_ust_context_set_session_provider(provider->name,
provider->get_size, provider->record,
- provider->get_value, provider->priv);
+ provider->get_value);
lttng_ust_context_set_event_notifier_group_provider(provider->name,
provider->get_size, provider->record,
- provider->get_value, provider->priv);
+ provider->get_value);
end:
ust_unlock();
return reg_provider;
void lttng_ust_context_provider_unregister(struct lttng_ust_registered_context_provider *reg_provider)
{
- lttng_ust_fixup_tls();
+ lttng_ust_common_init_thread(0);
if (ust_lock())
goto end;
lttng_ust_context_set_session_provider(reg_provider->provider->name,
lttng_ust_dummy_get_size, lttng_ust_dummy_record,
- lttng_ust_dummy_get_value, NULL);
+ lttng_ust_dummy_get_value);
lttng_ust_context_set_event_notifier_group_provider(reg_provider->provider->name,
lttng_ust_dummy_get_size, lttng_ust_dummy_record,
- lttng_ust_dummy_get_value, NULL);
+ lttng_ust_dummy_get_value);
cds_hlist_del(®_provider->node);
end:
free(reg_provider);
}
-static void destroy_app_ctx(void *priv)
+static
+void app_context_destroy(void *priv)
{
- struct lttng_ust_app_ctx *app_ctx = (struct lttng_ust_app_ctx *) priv;
+ struct lttng_ust_app_context *app_ctx = (struct lttng_ust_app_context *) priv;
- free(app_ctx->name);
+ free(app_ctx->ctx_name);
free(app_ctx->event_field);
- free(app_ctx->type);
- free(app_ctx);
}
+static
+const struct lttng_ust_type_common app_ctx_type = {
+ .type = lttng_ust_type_dynamic,
+};
+
/*
* Called with ust mutex held.
* Add application context to array of context, even if the application
const struct lttng_ust_context_provider *provider;
struct lttng_ust_ctx_field new_field = { 0 };
struct lttng_ust_event_field *event_field = NULL;
- struct lttng_ust_type_common *type = NULL;
- struct lttng_ust_app_ctx *app_ctx = NULL;
+ struct lttng_ust_app_context *app_ctx = NULL;
char *ctx_name;
int ret;
ret = -ENOMEM;
goto error_field_name_alloc;
}
- type = zmalloc(sizeof(struct lttng_ust_type_common));
- if (!type) {
- ret = -ENOMEM;
- goto error_field_type_alloc;
- }
- app_ctx = zmalloc(sizeof(struct lttng_ust_app_ctx));
+ app_ctx = zmalloc(sizeof(struct lttng_ust_app_context));
if (!app_ctx) {
ret = -ENOMEM;
goto error_app_ctx_alloc;
}
+ app_ctx->struct_size = sizeof(struct lttng_ust_app_context);
+ app_ctx->event_field = event_field;
+ app_ctx->ctx_name = ctx_name;
+
event_field->name = ctx_name;
- type->type = lttng_ust_type_dynamic;
- event_field->type = type;
+ event_field->type = &app_ctx_type;
new_field.event_field = event_field;
/*
* If provider is not found, we add the context anyway, but
new_field.record = lttng_ust_dummy_record;
new_field.get_value = lttng_ust_dummy_get_value;
}
- new_field.destroy = destroy_app_ctx;
new_field.priv = app_ctx;
+ new_field.destroy = app_context_destroy;
/*
* For application context, add it by expanding
* ctx array.
*/
ret = lttng_ust_context_append_rcu(ctx, &new_field);
if (ret) {
- destroy_app_ctx(app_ctx);
- return ret;
+ goto error_append;
}
return 0;
+error_append:
+ free(app_ctx);
error_app_ctx_alloc:
- free(type);
-error_field_type_alloc:
free(ctx_name);
error_field_name_alloc:
free(event_field);