#include <sys/types.h>
#include <unistd.h>
#include <urcu/compiler.h>
+#include <lttng/ust-error.h>
#include <common/common.h>
#include <common/sessiond-comm/sessiond-comm.h>
static
void delete_ust_app_event(int sock, struct ust_app_event *ua_event)
{
- int ret;
- struct lttng_ht_iter iter;
- struct ust_app_ctx *ua_ctx;
-
- /* Destroy each context of event */
- cds_lfht_for_each_entry(ua_event->ctx->ht, &iter.iter, ua_ctx,
- node.node) {
- ret = lttng_ht_del(ua_event->ctx, &iter);
- assert(!ret);
- delete_ust_app_ctx(sock, ua_ctx);
- }
free(ua_event->filter);
- lttng_ht_destroy(ua_event->ctx);
if (ua_event->obj != NULL) {
ustctl_release_object(sock, ua_event->obj);
ua_event->enabled = 1;
strncpy(ua_event->name, name, sizeof(ua_event->name));
ua_event->name[sizeof(ua_event->name) - 1] = '\0';
- ua_event->ctx = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
lttng_ht_node_init_str(&ua_event->node, ua_event->name);
/* Copy attributes */
return ret;
}
-/*
- * Create the event context on the tracer.
- */
-static
-int create_ust_event_context(struct ust_app_event *ua_event,
- struct ust_app_ctx *ua_ctx, struct ust_app *app)
-{
- int ret;
-
- health_code_update(&health_thread_cmd);
-
- ret = ustctl_add_context(app->sock, &ua_ctx->ctx,
- ua_event->obj, &ua_ctx->obj);
- if (ret < 0) {
- goto error;
- }
-
- ua_ctx->handle = ua_ctx->obj->handle;
-
- DBG2("UST app context created successfully for event %s", ua_event->name);
-
-error:
- health_code_update(&health_thread_cmd);
- return ret;
-}
-
/*
* Set the filter on the tracer.
*/
ret = ustctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
&ua_event->obj);
if (ret < 0) {
- if (ret == -EEXIST || ret == -EPERM) {
- ret = 0;
- goto error;
- }
ERR("Error ustctl create event %s for app pid: %d with ret %d",
ua_event->attr.name, app->pid, ret);
goto error;
* just created it.
*/
switch (ret) {
- case -EPERM:
+ case -LTTNG_UST_ERR_PERM:
/* Code flow problem */
assert(0);
- case -EEXIST:
+ case -LTTNG_UST_ERR_EXIST:
/* It's OK for our use case. */
ret = 0;
break;
static void shadow_copy_event(struct ust_app_event *ua_event,
struct ltt_ust_event *uevent)
{
- struct lttng_ht_iter iter;
- struct ltt_ust_context *uctx;
- struct ust_app_ctx *ua_ctx;
-
strncpy(ua_event->name, uevent->attr.name, sizeof(ua_event->name));
ua_event->name[sizeof(ua_event->name) - 1] = '\0';
memcpy(ua_event->filter, uevent->filter,
sizeof(*ua_event->filter) + uevent->filter->len);
}
- cds_lfht_for_each_entry(uevent->ctx->ht, &iter.iter, uctx, node.node) {
- ua_ctx = alloc_ust_app_ctx(&uctx->ctx);
- if (ua_ctx == NULL) {
- /* malloc() failed. We should simply stop */
- return;
- }
-
- lttng_ht_node_init_ulong(&ua_ctx->node,
- (unsigned long) ua_ctx->ctx.ctx);
- lttng_ht_add_unique_ulong(ua_event->ctx, &ua_ctx->node);
- }
}
/*
return ret;
}
-/*
- * Create an UST context and enable it for the event on the tracer.
- */
-static
-int create_ust_app_event_context(struct ust_app_session *ua_sess,
- struct ust_app_event *ua_event, struct lttng_ust_context *uctx,
- struct ust_app *app)
-{
- int ret = 0;
- struct lttng_ht_iter iter;
- struct lttng_ht_node_ulong *node;
- struct ust_app_ctx *ua_ctx;
-
- DBG2("UST app adding context to event %s", ua_event->name);
-
- lttng_ht_lookup(ua_event->ctx, (void *)((unsigned long)uctx->ctx), &iter);
- node = lttng_ht_iter_get_node_ulong(&iter);
- if (node != NULL) {
- ret = -EEXIST;
- goto error;
- }
-
- ua_ctx = alloc_ust_app_ctx(uctx);
- if (ua_ctx == NULL) {
- /* malloc failed */
- ret = -1;
- goto error;
- }
-
- lttng_ht_node_init_ulong(&ua_ctx->node, (unsigned long) ua_ctx->ctx.ctx);
- lttng_ht_add_unique_ulong(ua_event->ctx, &ua_ctx->node);
-
- ret = create_ust_event_context(ua_event, ua_ctx, app);
- if (ret < 0) {
- goto error;
- }
-
-error:
- return ret;
-}
-
/*
* Set UST filter for the event on the tracer.
*/
ret = create_ust_channel(app, ua_sess, ua_chan);
if (ret < 0) {
/* Not found previously means that it does not exist on the tracer */
- assert(ret != -EEXIST);
+ assert(ret != -LTTNG_UST_ERR_EXIST);
goto error;
}
ret = create_ust_event(app, ua_sess, ua_chan, ua_event);
if (ret < 0) {
/* Not found previously means that it does not exist on the tracer */
- assert(ret != -EEXIST);
+ assert(ret != -LTTNG_UST_ERR_EXIST);
goto error;
}
}
while ((ret = ustctl_tracepoint_list_get(app->sock, handle,
- &uiter)) != -ENOENT) {
+ &uiter)) != -LTTNG_UST_ERR_NOENT) {
health_code_update(&health_thread_cmd);
if (count >= nbmem) {
/* In case the realloc fails, we free the memory */
}
while ((ret = ustctl_tracepoint_field_list_get(app->sock, handle,
- &uiter)) != -ENOENT) {
+ &uiter)) != -LTTNG_UST_ERR_NOENT) {
health_code_update(&health_thread_cmd);
if (count >= nbmem) {
/* In case the realloc fails, we free the memory */
int ust_app_create_channel_glb(struct ltt_ust_session *usess,
struct ltt_ust_channel *uchan)
{
+ int ret = 0;
struct lttng_ht_iter iter;
struct ust_app *app;
struct ust_app_session *ua_sess;
ua_sess = create_ust_app_session(usess, app);
if (ua_sess == NULL) {
/* The malloc() failed. */
+ ret = -1;
goto error;
} else if (ua_sess == (void *) -1UL) {
/* The application's socket is not valid. Contiuing */
+ ret = -1;
continue;
}
ua_chan = create_ust_app_channel(ua_sess, uchan, app);
if (ua_chan == NULL) {
/* Major problem here and it's maybe the tracer or malloc() */
+ ret = -1;
goto error;
}
}
rcu_read_unlock();
- return 0;
-
error:
- return -1;
+ return ret;
}
/*
ret = create_ust_app_event(ua_sess, ua_chan, uevent, app);
if (ret < 0) {
- if (ret != -EEXIST) {
+ if (ret != -LTTNG_UST_ERR_EXIST) {
/* Possible value at this point: -ENOMEM. If so, we stop! */
break;
}
continue;
}
- /* Add context on events. */
- cds_lfht_for_each_entry(ua_event->ctx->ht, &iter_ctx.iter,
- ua_ctx, node.node) {
- ret = create_ust_event_context(ua_event, ua_ctx, app);
- if (ret < 0) {
- /* FIXME: Should we quit here or continue... */
- continue;
- }
- }
ret = set_ust_event_filter(ua_event, app);
if (ret < 0) {
/* FIXME: Should we quit here or continue... */
return ret;
}
-/*
- * Add context to a specific event in a channel for global UST domain.
- */
-int ust_app_add_ctx_event_glb(struct ltt_ust_session *usess,
- struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent,
- struct ltt_ust_context *uctx)
-{
- int ret = 0;
- struct lttng_ht_node_str *ua_chan_node, *ua_event_node;
- struct lttng_ht_iter iter, uiter;
- struct ust_app_session *ua_sess;
- struct ust_app_event *ua_event;
- struct ust_app_channel *ua_chan = NULL;
- struct ust_app *app;
-
- rcu_read_lock();
-
- cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
- if (!app->compatible) {
- /*
- * TODO: In time, we should notice the caller of this error by
- * telling him that this is a version error.
- */
- continue;
- }
- ua_sess = lookup_session_by_app(usess, app);
- if (ua_sess == NULL) {
- continue;
- }
-
- /* Lookup channel in the ust app session */
- lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
- ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
- if (ua_chan_node == NULL) {
- continue;
- }
- ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel,
- node);
-
- lttng_ht_lookup(ua_chan->events, (void *)uevent->attr.name, &uiter);
- ua_event_node = lttng_ht_iter_get_node_str(&uiter);
- if (ua_event_node == NULL) {
- continue;
- }
- ua_event = caa_container_of(ua_event_node, struct ust_app_event,
- node);
-
- ret = create_ust_app_event_context(ua_sess, ua_event, &uctx->ctx, app);
- if (ret < 0) {
- continue;
- }
- }
-
- rcu_read_unlock();
- return ret;
-}
-
/*
* Add context to a specific event in a channel for global UST domain.
*/