*/
#define _LGPL_SOURCE
+#include <errno.h>
+#include <fcntl.h>
#include <inttypes.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <common/hashtable/utils.h>
#include <lttng/event-rule/event-rule.h>
#include <lttng/event-rule/event-rule-internal.h>
-#include <lttng/event-rule/tracepoint.h>
+#include <lttng/event-rule/user-tracepoint.h>
#include <lttng/condition/condition.h>
-#include <lttng/condition/event-rule-internal.h>
-#include <lttng/condition/event-rule.h>
+#include <lttng/condition/event-rule-matches-internal.h>
+#include <lttng/condition/event-rule-matches.h>
+#include <lttng/trigger/trigger-internal.h>
#include <common/sessiond-comm/sessiond-comm.h>
#include "buffer-registry.h"
+#include "condition-internal.h"
#include "fd-limit.h"
#include "health-sessiond.h"
#include "ust-app.h"
#include "notification-thread-commands.h"
#include "rotate.h"
#include "event.h"
+#include "event-notifier-error-accounting.h"
+
struct lttng_ht *ust_app_ht;
struct lttng_ht *ust_app_ht_by_sock;
}
static void copy_channel_attr_to_ustctl(
- struct ustctl_consumer_channel_attr *attr,
- struct lttng_ust_channel_attr *uattr)
+ struct lttng_ust_ctl_consumer_channel_attr *attr,
+ struct lttng_ust_abi_channel_attr *uattr)
{
/* Copy event attributes since the layout is different. */
attr->subbuf_size = uattr->subbuf_size;
/* Event loglevel. */
if (ev_loglevel_value != key->loglevel_type) {
- if (event->attr.loglevel_type == LTTNG_UST_LOGLEVEL_ALL
+ if (event->attr.loglevel_type == LTTNG_UST_ABI_LOGLEVEL_ALL
&& key->loglevel_type == 0 &&
ev_loglevel_value == -1) {
/*
/* Both exclusions exists, check count followed by the names. */
if (event->exclusion->count != key->exclusion->count ||
memcmp(event->exclusion->names, key->exclusion->names,
- event->exclusion->count * LTTNG_UST_SYM_NAME_LEN) != 0) {
+ event->exclusion->count * LTTNG_UST_ABI_SYM_NAME_LEN) != 0) {
goto no_match;
}
}
if (ua_ctx->obj) {
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_release_object(sock, ua_ctx->obj);
+ ret = lttng_ust_ctl_release_object(sock, ua_ctx->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app sock %d release ctx obj handle %d failed with ret %d",
free(ua_event->exclusion);
if (ua_event->obj != NULL) {
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_release_object(sock, ua_event->obj);
+ ret = lttng_ust_ctl_release_object(sock, ua_event->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app sock %d release event obj failed with ret %d",
if (ua_event_notifier_rule->obj != NULL) {
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_release_object(sock, ua_event_notifier_rule->obj);
+ ret = lttng_ust_ctl_release_object(sock, ua_event_notifier_rule->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("Failed to release event notifier object: app = '%s' (ppid %d), ret = %d",
if (stream->obj) {
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_release_object(sock, stream->obj);
+ ret = lttng_ust_ctl_release_object(sock, stream->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app sock %d release stream obj failed with ret %d",
struct ltt_session *session;
struct ltt_ust_channel *uchan;
- if (ua_chan->attr.type != LTTNG_UST_CHAN_PER_CPU) {
+ if (ua_chan->attr.type != LTTNG_UST_ABI_CHAN_PER_CPU) {
return;
}
ret = lttng_ht_del(app->ust_objd, &iter);
assert(!ret);
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_release_object(sock, ua_chan->obj);
+ ret = lttng_ust_ctl_release_object(sock, ua_chan->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app sock %d release channel obj failed with ret %d",
int ret;
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_register_done(app->sock);
+ ret = lttng_ust_ctl_register_done(app->sock);
pthread_mutex_unlock(&app->sock_lock);
return ret;
}
-int ust_app_release_object(struct ust_app *app, struct lttng_ust_object_data *data)
+int ust_app_release_object(struct ust_app *app, struct lttng_ust_abi_object_data *data)
{
int ret, sock;
} else {
sock = -1;
}
- ret = ustctl_release_object(sock, data);
+ ret = lttng_ust_ctl_release_object(sock, data);
if (app) {
pthread_mutex_unlock(&app->sock_lock);
}
if (ua_sess->handle != -1) {
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_release_handle(sock, ua_sess->handle);
+ ret = lttng_ust_ctl_release_handle(sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app sock %d release session handle failed with ret %d",
*/
if (app->event_notifier_group.object) {
enum lttng_error_code ret_code;
+ enum event_notifier_error_accounting_status status;
+
const int event_notifier_read_fd = lttng_pipe_get_readfd(
app->event_notifier_group.event_pipe);
ret_code = notification_thread_command_remove_tracer_event_source(
- notification_thread_handle,
+ the_notification_thread_handle,
event_notifier_read_fd);
if (ret_code != LTTNG_OK) {
ERR("Failed to remove application tracer event source from notification thread");
}
- ustctl_release_object(sock, app->event_notifier_group.object);
+ status = event_notifier_error_accounting_unregister_app(app);
+ if (status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
+ ERR("Error unregistering app from event notifier error accounting");
+ }
+
+ lttng_ust_ctl_release_object(sock, app->event_notifier_group.object);
free(app->event_notifier_group.object);
}
ua_sess->handle = -1;
ua_sess->channels = lttng_ht_new(0, LTTNG_HT_TYPE_STRING);
- ua_sess->metadata_attr.type = LTTNG_UST_CHAN_METADATA;
+ ua_sess->metadata_attr.type = LTTNG_UST_ABI_CHAN_METADATA;
pthread_mutex_init(&ua_sess->lock, NULL);
return ua_sess;
static
struct ust_app_channel *alloc_ust_app_channel(const char *name,
struct ust_app_session *ua_sess,
- struct lttng_ust_channel_attr *attr)
+ struct lttng_ust_abi_channel_attr *attr)
{
struct ust_app_channel *ua_chan;
/* Copy attributes */
if (attr) {
- /* Translate from lttng_ust_channel to ustctl_consumer_channel_attr. */
+ /* Translate from lttng_ust_channel to lttng_ust_ctl_consumer_channel_attr. */
ua_chan->attr.subbuf_size = attr->subbuf_size;
ua_chan->attr.num_subbuf = attr->num_subbuf;
ua_chan->attr.overwrite = attr->overwrite;
ua_chan->attr.blocking_timeout = attr->u.s.blocking_timeout;
}
/* By default, the channel is a per cpu channel. */
- ua_chan->attr.type = LTTNG_UST_CHAN_PER_CPU;
+ ua_chan->attr.type = LTTNG_UST_ABI_CHAN_PER_CPU;
DBG3("UST app channel %s allocated", ua_chan->name);
*/
static
struct ust_app_event *alloc_ust_app_event(char *name,
- struct lttng_ust_event *attr)
+ struct lttng_ust_abi_event *attr)
{
struct ust_app_event *ua_event;
condition = lttng_trigger_get_condition(trigger);
assert(condition);
- assert(lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_EVENT_RULE_HIT);
+ assert(lttng_condition_get_type(condition) ==
+ LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES);
- assert(LTTNG_CONDITION_STATUS_OK == lttng_condition_event_rule_get_rule(condition, &event_rule));
+ assert(LTTNG_CONDITION_STATUS_OK ==
+ lttng_condition_event_rule_matches_get_rule(
+ condition, &event_rule));
assert(event_rule);
+ ua_event_notifier_rule->error_counter_index =
+ lttng_condition_event_rule_matches_get_error_counter_index(condition);
/* Acquire the event notifier's reference to the trigger. */
lttng_trigger_get(trigger);
if (uctx) {
memcpy(&ua_ctx->ctx, uctx, sizeof(ua_ctx->ctx));
- if (uctx->ctx == LTTNG_UST_CONTEXT_APP_CONTEXT) {
+ if (uctx->ctx == LTTNG_UST_ABI_CONTEXT_APP_CONTEXT) {
char *provider_name = NULL, *ctx_name = NULL;
provider_name = strdup(uctx->u.app_ctx.provider_name);
*
* Return allocated filter or NULL on error.
*/
-static struct lttng_ust_filter_bytecode *create_ust_bytecode_from_bytecode(
+static struct lttng_ust_abi_filter_bytecode *create_ust_filter_bytecode_from_bytecode(
const struct lttng_bytecode *orig_f)
{
- struct lttng_ust_filter_bytecode *filter = NULL;
+ struct lttng_ust_abi_filter_bytecode *filter = NULL;
- /* Copy filter bytecode */
+ /* Copy filter bytecode. */
filter = zmalloc(sizeof(*filter) + orig_f->len);
if (!filter) {
- PERROR("zmalloc alloc ust filter bytecode");
+ PERROR("Failed to allocate lttng_ust_filter_bytecode: bytecode len = %" PRIu32 " bytes", orig_f->len);
goto error;
}
assert(sizeof(struct lttng_bytecode) ==
- sizeof(struct lttng_ust_filter_bytecode));
+ sizeof(struct lttng_ust_abi_filter_bytecode));
memcpy(filter, orig_f, sizeof(*filter) + orig_f->len);
error:
return filter;
}
+/*
+ * Create a liblttng-ust capture bytecode from given bytecode.
+ *
+ * Return allocated filter or NULL on error.
+ */
+static struct lttng_ust_abi_capture_bytecode *
+create_ust_capture_bytecode_from_bytecode(const struct lttng_bytecode *orig_f)
+{
+ struct lttng_ust_abi_capture_bytecode *capture = NULL;
+
+ /* Copy capture bytecode. */
+ capture = zmalloc(sizeof(*capture) + orig_f->len);
+ if (!capture) {
+ PERROR("Failed to allocate lttng_ust_abi_capture_bytecode: bytecode len = %" PRIu32 " bytes", orig_f->len);
+ goto error;
+ }
+
+ assert(sizeof(struct lttng_bytecode) ==
+ sizeof(struct lttng_ust_abi_capture_bytecode));
+ memcpy(capture, orig_f, sizeof(*capture) + orig_f->len);
+error:
+ return capture;
+}
+
/*
* Find an ust_app using the sock and return it. RCU read side lock must be
* held before calling this helper function.
health_code_update();
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_add_context(app->sock, &ua_ctx->ctx,
+ ret = lttng_ust_ctl_add_context(app->sock, &ua_ctx->ctx,
ua_chan->obj, &ua_ctx->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
*/
static int set_ust_object_filter(struct ust_app *app,
const struct lttng_bytecode *bytecode,
- struct lttng_ust_object_data *ust_object)
+ struct lttng_ust_abi_object_data *ust_object)
{
int ret;
- struct lttng_ust_filter_bytecode *ust_bytecode = NULL;
+ struct lttng_ust_abi_filter_bytecode *ust_bytecode = NULL;
health_code_update();
- ust_bytecode = create_ust_bytecode_from_bytecode(bytecode);
+ ust_bytecode = create_ust_filter_bytecode_from_bytecode(bytecode);
if (!ust_bytecode) {
ret = -LTTNG_ERR_NOMEM;
goto error;
}
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_set_filter(app->sock, ust_bytecode,
+ ret = lttng_ust_ctl_set_filter(app->sock, ust_bytecode,
ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
- ERR("UST app set object filter failed for object %p of app (pid: %d) "
- "with ret %d", ust_object, app->pid, ret);
+ ERR("UST app set object filter failed: object = %p of app pid = %d, ret = %d",
+ ust_object, app->pid, ret);
} else {
/*
* This is normal behavior, an application can die during the
goto error;
}
- DBG2("UST filter successfully set for object %p", ust_object);
+ DBG2("UST filter successfully set: object = %p", ust_object);
+
+error:
+ health_code_update();
+ free(ust_bytecode);
+ return ret;
+}
+
+/*
+ * Set a capture bytecode for the passed object.
+ * The sequence number enforces the ordering at runtime and on reception of
+ * the captured payloads.
+ */
+static int set_ust_capture(struct ust_app *app,
+ const struct lttng_bytecode *bytecode,
+ unsigned int capture_seqnum,
+ struct lttng_ust_abi_object_data *ust_object)
+{
+ int ret;
+ struct lttng_ust_abi_capture_bytecode *ust_bytecode = NULL;
+
+ health_code_update();
+
+ ust_bytecode = create_ust_capture_bytecode_from_bytecode(bytecode);
+ if (!ust_bytecode) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto error;
+ }
+
+ /*
+ * Set the sequence number to ensure the capture of fields is ordered.
+ */
+ ust_bytecode->seqnum = capture_seqnum;
+
+ pthread_mutex_lock(&app->sock_lock);
+ ret = lttng_ust_ctl_set_capture(app->sock, ust_bytecode,
+ ust_object);
+ pthread_mutex_unlock(&app->sock_lock);
+ if (ret < 0) {
+ if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
+ ERR("UST app set object capture failed: object = %p of app pid = %d, ret = %d",
+ ust_object, app->pid, ret);
+ } else {
+ /*
+ * This is normal behavior, an application can die during the
+ * creation process. Don't report an error so the execution can
+ * continue normally.
+ */
+ ret = 0;
+ DBG3("Failed to set UST app object capture. Application is dead.");
+ }
+
+ goto error;
+ }
+
+ DBG2("UST capture successfully set: object = %p", ust_object);
error:
health_code_update();
}
static
-struct lttng_ust_event_exclusion *create_ust_exclusion_from_exclusion(
+struct lttng_ust_abi_event_exclusion *create_ust_exclusion_from_exclusion(
const struct lttng_event_exclusion *exclusion)
{
- struct lttng_ust_event_exclusion *ust_exclusion = NULL;
- size_t exclusion_alloc_size = sizeof(struct lttng_ust_event_exclusion) +
- LTTNG_UST_SYM_NAME_LEN * exclusion->count;
+ struct lttng_ust_abi_event_exclusion *ust_exclusion = NULL;
+ size_t exclusion_alloc_size = sizeof(struct lttng_ust_abi_event_exclusion) +
+ LTTNG_UST_ABI_SYM_NAME_LEN * exclusion->count;
ust_exclusion = zmalloc(exclusion_alloc_size);
if (!ust_exclusion) {
}
assert(sizeof(struct lttng_event_exclusion) ==
- sizeof(struct lttng_ust_event_exclusion));
+ sizeof(struct lttng_ust_abi_event_exclusion));
memcpy(ust_exclusion, exclusion, exclusion_alloc_size);
end:
return ust_exclusion;
*/
static int set_ust_object_exclusions(struct ust_app *app,
const struct lttng_event_exclusion *exclusions,
- struct lttng_ust_object_data *ust_object)
+ struct lttng_ust_abi_object_data *ust_object)
{
int ret;
- struct lttng_ust_event_exclusion *ust_exclusions = NULL;
+ struct lttng_ust_abi_event_exclusion *ust_exclusions = NULL;
assert(exclusions && exclusions->count > 0);
goto error;
}
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_set_exclusion(app->sock, ust_exclusions, ust_object);
+ ret = lttng_ust_ctl_set_exclusion(app->sock, ust_exclusions, ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
* Disable the specified event on to UST tracer for the UST session.
*/
static int disable_ust_object(struct ust_app *app,
- struct lttng_ust_object_data *object)
+ struct lttng_ust_abi_object_data *object)
{
int ret;
health_code_update();
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_disable(app->sock, object);
+ ret = lttng_ust_ctl_disable(app->sock, object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
health_code_update();
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_disable(app->sock, ua_chan->obj);
+ ret = lttng_ust_ctl_disable(app->sock, ua_chan->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
health_code_update();
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_enable(app->sock, ua_chan->obj);
+ ret = lttng_ust_ctl_enable(app->sock, ua_chan->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
* Enable the specified event on to UST tracer for the UST session.
*/
static int enable_ust_object(
- struct ust_app *app, struct lttng_ust_object_data *ust_object)
+ struct ust_app *app, struct lttng_ust_abi_object_data *ust_object)
{
int ret;
health_code_update();
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_enable(app->sock, ust_object);
+ ret = lttng_ust_ctl_enable(app->sock, ust_object);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
/* Create UST event on tracer */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
+ ret = lttng_ust_ctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
&ua_event->obj);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
static int init_ust_event_notifier_from_event_rule(
const struct lttng_event_rule *rule,
- struct lttng_ust_event_notifier *event_notifier)
+ struct lttng_ust_abi_event_notifier *event_notifier)
{
enum lttng_event_rule_status status;
- enum lttng_loglevel_type loglevel_type;
- enum lttng_ust_loglevel_type ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL;
+ enum lttng_ust_abi_loglevel_type ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL;
int loglevel = -1, ret = 0;
const char *pattern;
- /* For now only LTTNG_EVENT_RULE_TYPE_TRACEPOINT are supported. */
- assert(lttng_event_rule_get_type(rule) ==
- LTTNG_EVENT_RULE_TYPE_TRACEPOINT);
memset(event_notifier, 0, sizeof(*event_notifier));
pattern = event_get_default_agent_ust_name(
lttng_event_rule_get_domain_type(rule));
loglevel = 0;
- ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL;
+ ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL;
} else {
- status = lttng_event_rule_tracepoint_get_pattern(
- rule, &pattern);
- if (status != LTTNG_EVENT_RULE_STATUS_OK) {
- /* At this point, this is a fatal error. */
- abort();
- }
+ const struct lttng_log_level_rule *log_level_rule;
- status = lttng_event_rule_tracepoint_get_log_level_type(
- rule, &loglevel_type);
+ assert(lttng_event_rule_get_type(rule) ==
+ LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT);
+
+ status = lttng_event_rule_user_tracepoint_get_name_pattern(rule, &pattern);
if (status != LTTNG_EVENT_RULE_STATUS_OK) {
/* At this point, this is a fatal error. */
abort();
}
- switch (loglevel_type) {
- case LTTNG_EVENT_LOGLEVEL_ALL:
- ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL;
- break;
- case LTTNG_EVENT_LOGLEVEL_RANGE:
- ust_loglevel_type = LTTNG_UST_LOGLEVEL_RANGE;
- break;
- case LTTNG_EVENT_LOGLEVEL_SINGLE:
- ust_loglevel_type = LTTNG_UST_LOGLEVEL_SINGLE;
- break;
- default:
- /* Unknown log level specification type. */
- abort();
- }
+ status = lttng_event_rule_user_tracepoint_get_log_level_rule(
+ rule, &log_level_rule);
+ if (status == LTTNG_EVENT_RULE_STATUS_UNSET) {
+ ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL;
+ } else if (status == LTTNG_EVENT_RULE_STATUS_OK) {
+ enum lttng_log_level_rule_status llr_status;
- if (loglevel_type != LTTNG_EVENT_LOGLEVEL_ALL) {
- status = lttng_event_rule_tracepoint_get_log_level(
- rule, &loglevel);
- assert(status == LTTNG_EVENT_RULE_STATUS_OK);
+ switch (lttng_log_level_rule_get_type(log_level_rule)) {
+ case LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY:
+ ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_SINGLE;
+ llr_status = lttng_log_level_rule_exactly_get_level(
+ log_level_rule, &loglevel);
+ break;
+ case LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS:
+ ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_RANGE;
+ llr_status = lttng_log_level_rule_at_least_as_severe_as_get_level(
+ log_level_rule, &loglevel);
+ break;
+ default:
+ abort();
+ }
+
+ assert(llr_status == LTTNG_LOG_LEVEL_RULE_STATUS_OK);
+ } else {
+ /* At this point this is a fatal error. */
+ abort();
}
}
- event_notifier->event.instrumentation = LTTNG_UST_TRACEPOINT;
+ event_notifier->event.instrumentation = LTTNG_UST_ABI_TRACEPOINT;
ret = lttng_strncpy(event_notifier->event.name, pattern,
- LTTNG_UST_SYM_NAME_LEN - 1);
+ LTTNG_UST_ABI_SYM_NAME_LEN - 1);
if (ret) {
ERR("Failed to copy event rule pattern to notifier: pattern = '%s' ",
pattern);
int ret = 0;
enum lttng_condition_status condition_status;
const struct lttng_condition *condition = NULL;
- struct lttng_ust_event_notifier event_notifier;
+ struct lttng_ust_abi_event_notifier event_notifier;
const struct lttng_event_rule *event_rule = NULL;
+ unsigned int capture_bytecode_count = 0, i;
+ enum lttng_condition_status cond_status;
+ enum lttng_event_rule_type event_rule_type;
health_code_update();
assert(app->event_notifier_group.object);
condition = lttng_trigger_get_const_condition(
ua_event_notifier_rule->trigger);
assert(condition);
- assert(lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_EVENT_RULE_HIT);
+ assert(lttng_condition_get_type(condition) ==
+ LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES);
- condition_status = lttng_condition_event_rule_get_rule(condition, &event_rule);
+ condition_status = lttng_condition_event_rule_matches_get_rule(
+ condition, &event_rule);
assert(condition_status == LTTNG_CONDITION_STATUS_OK);
+
assert(event_rule);
- assert(lttng_event_rule_get_type(event_rule) == LTTNG_EVENT_RULE_TYPE_TRACEPOINT);
+
+ event_rule_type = lttng_event_rule_get_type(event_rule);
+ assert(event_rule_type == LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT ||
+ event_rule_type == LTTNG_EVENT_RULE_TYPE_JUL_LOGGING ||
+ event_rule_type ==
+ LTTNG_EVENT_RULE_TYPE_LOG4J_LOGGING ||
+ event_rule_type ==
+ LTTNG_EVENT_RULE_TYPE_PYTHON_LOGGING);
init_ust_event_notifier_from_event_rule(event_rule, &event_notifier);
event_notifier.event.token = ua_event_notifier_rule->token;
+ event_notifier.error_counter_index = ua_event_notifier_rule->error_counter_index;
/* Create UST event notifier against the tracer. */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_create_event_notifier(app->sock, &event_notifier,
+ ret = lttng_ust_ctl_create_event_notifier(app->sock, &event_notifier,
app->event_notifier_group.object,
&ua_event_notifier_rule->obj);
pthread_mutex_unlock(&app->sock_lock);
}
}
+ /* Set the capture bytecodes. */
+ cond_status = lttng_condition_event_rule_matches_get_capture_descriptor_count(
+ condition, &capture_bytecode_count);
+ assert(cond_status == LTTNG_CONDITION_STATUS_OK);
+
+ for (i = 0; i < capture_bytecode_count; i++) {
+ const struct lttng_bytecode *capture_bytecode =
+ lttng_condition_event_rule_matches_get_capture_bytecode_at_index(
+ condition, i);
+
+ ret = set_ust_capture(app, capture_bytecode, i,
+ ua_event_notifier_rule->obj);
+ if (ret < 0) {
+ goto error;
+ }
+ }
+
/*
* We now need to explicitly enable the event, since it
* is disabled at creation.
/* Copy exclusion data */
if (uevent->exclusion) {
exclusion_alloc_size = sizeof(struct lttng_event_exclusion) +
- LTTNG_UST_SYM_NAME_LEN * uevent->exclusion->count;
+ LTTNG_UST_ABI_SYM_NAME_LEN * uevent->exclusion->count;
ua_event->exclusion = zmalloc(exclusion_alloc_size);
if (ua_event->exclusion == NULL) {
PERROR("malloc");
* be NULL.
*
* Returns 0 on success or else a negative code which is either -ENOMEM or
- * -ENOTCONN which is the default code if the ustctl_create_session fails.
+ * -ENOTCONN which is the default code if the lttng_ust_ctl_create_session fails.
*/
static int find_or_create_ust_app_session(struct ltt_ust_session *usess,
struct ust_app *app, struct ust_app_session **ua_sess_ptr,
if (ua_sess->handle == -1) {
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_create_session(app->sock);
+ ret = lttng_ust_ctl_create_session(app->sock);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
}
switch(key->ctx) {
- case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER:
+ case LTTNG_UST_ABI_CONTEXT_PERF_THREAD_COUNTER:
if (strncmp(key->u.perf_counter.name,
ctx->ctx.u.perf_counter.name,
sizeof(key->u.perf_counter.name))) {
goto no_match;
}
break;
- case LTTNG_UST_CONTEXT_APP_CONTEXT:
+ case LTTNG_UST_ABI_CONTEXT_APP_CONTEXT:
if (strcmp(key->u.app_ctx.provider_name,
ctx->ctx.u.app_ctx.provider_name) ||
strcmp(key->u.app_ctx.ctx_name,
health_code_update();
/*
- * Now get the channel from the consumer. This call wil populate the stream
+ * Now get the channel from the consumer. This call will populate the stream
* list of that channel and set the ust objects.
*/
if (usess->consumer->enabled) {
}
/* Duplicate object for stream once the original is in the registry. */
- ret = ustctl_duplicate_ust_object_data(&stream->obj,
+ ret = lttng_ust_ctl_duplicate_ust_object_data(&stream->obj,
reg_stream->obj.ust);
if (ret < 0) {
ERR("Duplicate stream obj from %p to %p failed with ret %d",
*
* Return 0 on success or else a negative value.
*/
-static int duplicate_channel_object(struct buffer_reg_channel *reg_chan,
+static int duplicate_channel_object(struct buffer_reg_channel *buf_reg_chan,
struct ust_app_channel *ua_chan)
{
int ret;
- assert(reg_chan);
+ assert(buf_reg_chan);
assert(ua_chan);
/* Need two fds for the channel. */
}
/* Duplicate object for stream once the original is in the registry. */
- ret = ustctl_duplicate_ust_object_data(&ua_chan->obj, reg_chan->obj.ust);
+ ret = lttng_ust_ctl_duplicate_ust_object_data(&ua_chan->obj, buf_reg_chan->obj.ust);
if (ret < 0) {
ERR("Duplicate channel obj from %p to %p failed with ret: %d",
- reg_chan->obj.ust, ua_chan->obj, ret);
+ buf_reg_chan->obj.ust, ua_chan->obj, ret);
goto error;
}
ua_chan->handle = ua_chan->obj->handle;
*
* Return 0 on success or else a negative value.
*/
-static int setup_buffer_reg_streams(struct buffer_reg_channel *reg_chan,
+static int setup_buffer_reg_streams(struct buffer_reg_channel *buf_reg_chan,
struct ust_app_channel *ua_chan,
struct ust_app *app)
{
int ret = 0;
struct ust_app_stream *stream, *stmp;
- assert(reg_chan);
+ assert(buf_reg_chan);
assert(ua_chan);
DBG2("UST app setup buffer registry stream");
*/
reg_stream->obj.ust = stream->obj;
stream->obj = NULL;
- buffer_reg_stream_add(reg_stream, reg_chan);
+ buffer_reg_stream_add(reg_stream, buf_reg_chan);
/* We don't need the streams anymore. */
cds_list_del(&stream->list);
struct ust_app_channel *ua_chan, struct buffer_reg_channel **regp)
{
int ret;
- struct buffer_reg_channel *reg_chan = NULL;
+ struct buffer_reg_channel *buf_reg_chan = NULL;
assert(reg_sess);
assert(ua_chan);
DBG2("UST app creating buffer registry channel for %s", ua_chan->name);
/* Create buffer registry channel. */
- ret = buffer_reg_channel_create(ua_chan->tracing_channel_id, ®_chan);
+ ret = buffer_reg_channel_create(ua_chan->tracing_channel_id, &buf_reg_chan);
if (ret < 0) {
goto error_create;
}
- assert(reg_chan);
- reg_chan->consumer_key = ua_chan->key;
- reg_chan->subbuf_size = ua_chan->attr.subbuf_size;
- reg_chan->num_subbuf = ua_chan->attr.num_subbuf;
+ assert(buf_reg_chan);
+ buf_reg_chan->consumer_key = ua_chan->key;
+ buf_reg_chan->subbuf_size = ua_chan->attr.subbuf_size;
+ buf_reg_chan->num_subbuf = ua_chan->attr.num_subbuf;
/* Create and add a channel registry to session. */
ret = ust_registry_channel_add(reg_sess->reg.ust,
if (ret < 0) {
goto error;
}
- buffer_reg_channel_add(reg_sess, reg_chan);
+ buffer_reg_channel_add(reg_sess, buf_reg_chan);
if (regp) {
- *regp = reg_chan;
+ *regp = buf_reg_chan;
}
return 0;
error:
/* Safe because the registry channel object was not added to any HT. */
- buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
+ buffer_reg_channel_destroy(buf_reg_chan, LTTNG_DOMAIN_UST);
error_create:
return ret;
}
* Return 0 on success else a negative value.
*/
static int setup_buffer_reg_channel(struct buffer_reg_session *reg_sess,
- struct ust_app_channel *ua_chan, struct buffer_reg_channel *reg_chan,
+ struct ust_app_channel *ua_chan, struct buffer_reg_channel *buf_reg_chan,
struct ust_app *app)
{
int ret;
assert(reg_sess);
- assert(reg_chan);
+ assert(buf_reg_chan);
assert(ua_chan);
assert(ua_chan->obj);
DBG2("UST app setup buffer registry channel for %s", ua_chan->name);
/* Setup all streams for the registry. */
- ret = setup_buffer_reg_streams(reg_chan, ua_chan, app);
+ ret = setup_buffer_reg_streams(buf_reg_chan, ua_chan, app);
if (ret < 0) {
goto error;
}
- reg_chan->obj.ust = ua_chan->obj;
+ buf_reg_chan->obj.ust = ua_chan->obj;
ua_chan->obj = NULL;
return 0;
error:
- buffer_reg_channel_remove(reg_sess, reg_chan);
- buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
+ buffer_reg_channel_remove(reg_sess, buf_reg_chan);
+ buffer_reg_channel_destroy(buf_reg_chan, LTTNG_DOMAIN_UST);
return ret;
}
*
* Return 0 on success else a negative value.
*/
-static int send_channel_uid_to_ust(struct buffer_reg_channel *reg_chan,
+static int send_channel_uid_to_ust(struct buffer_reg_channel *buf_reg_chan,
struct ust_app *app, struct ust_app_session *ua_sess,
struct ust_app_channel *ua_chan)
{
int ret;
struct buffer_reg_stream *reg_stream;
- assert(reg_chan);
+ assert(buf_reg_chan);
assert(app);
assert(ua_sess);
assert(ua_chan);
DBG("UST app sending buffer registry channel to ust sock %d", app->sock);
- ret = duplicate_channel_object(reg_chan, ua_chan);
+ ret = duplicate_channel_object(buf_reg_chan, ua_chan);
if (ret < 0) {
goto error;
}
health_code_update();
/* Send all streams to application. */
- pthread_mutex_lock(®_chan->stream_list_lock);
- cds_list_for_each_entry(reg_stream, ®_chan->streams, lnode) {
+ pthread_mutex_lock(&buf_reg_chan->stream_list_lock);
+ cds_list_for_each_entry(reg_stream, &buf_reg_chan->streams, lnode) {
struct ust_app_stream stream;
ret = duplicate_stream_object(reg_stream, &stream);
ua_chan->is_sent = 1;
error_stream_unlock:
- pthread_mutex_unlock(®_chan->stream_list_lock);
+ pthread_mutex_unlock(&buf_reg_chan->stream_list_lock);
error:
return ret;
}
{
int ret;
struct buffer_reg_uid *reg_uid;
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
struct ltt_session *session = NULL;
enum lttng_error_code notification_ret;
- struct ust_registry_channel *chan_reg;
+ struct ust_registry_channel *ust_reg_chan;
assert(app);
assert(usess);
*/
assert(reg_uid);
- reg_chan = buffer_reg_channel_find(ua_chan->tracing_channel_id,
+ buf_reg_chan = buffer_reg_channel_find(ua_chan->tracing_channel_id,
reg_uid);
- if (reg_chan) {
+ if (buf_reg_chan) {
goto send_channel;
}
/* Create the buffer registry channel object. */
- ret = create_buffer_reg_channel(reg_uid->registry, ua_chan, ®_chan);
+ ret = create_buffer_reg_channel(reg_uid->registry, ua_chan, &buf_reg_chan);
if (ret < 0) {
ERR("Error creating the UST channel \"%s\" registry instance",
ua_chan->name);
*/
ust_registry_channel_del_free(reg_uid->registry->reg.ust,
ua_chan->tracing_channel_id, false);
- buffer_reg_channel_remove(reg_uid->registry, reg_chan);
- buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
+ buffer_reg_channel_remove(reg_uid->registry, buf_reg_chan);
+ buffer_reg_channel_destroy(buf_reg_chan, LTTNG_DOMAIN_UST);
goto error;
}
* Setup the streams and add it to the session registry.
*/
ret = setup_buffer_reg_channel(reg_uid->registry,
- ua_chan, reg_chan, app);
+ ua_chan, buf_reg_chan, app);
if (ret < 0) {
ERR("Error setting up UST channel \"%s\"", ua_chan->name);
goto error;
/* Notify the notification subsystem of the channel's creation. */
pthread_mutex_lock(®_uid->registry->reg.ust->lock);
- chan_reg = ust_registry_channel_find(reg_uid->registry->reg.ust,
+ ust_reg_chan = ust_registry_channel_find(reg_uid->registry->reg.ust,
ua_chan->tracing_channel_id);
- assert(chan_reg);
- chan_reg->consumer_key = ua_chan->key;
- chan_reg = NULL;
+ assert(ust_reg_chan);
+ ust_reg_chan->consumer_key = ua_chan->key;
+ ust_reg_chan = NULL;
pthread_mutex_unlock(®_uid->registry->reg.ust->lock);
notification_ret = notification_thread_command_add_channel(
- notification_thread_handle, session->name,
- lttng_credentials_get_uid(&ua_sess->effective_credentials),
- lttng_credentials_get_gid(&ua_sess->effective_credentials),
- ua_chan->name,
- ua_chan->key, LTTNG_DOMAIN_UST,
+ the_notification_thread_handle, session->name,
+ lttng_credentials_get_uid(
+ &ua_sess->effective_credentials),
+ lttng_credentials_get_gid(
+ &ua_sess->effective_credentials),
+ ua_chan->name, ua_chan->key, LTTNG_DOMAIN_UST,
ua_chan->attr.subbuf_size * ua_chan->attr.num_subbuf);
if (notification_ret != LTTNG_OK) {
ret = - (int) notification_ret;
send_channel:
/* Send buffers to the application. */
- ret = send_channel_uid_to_ust(reg_chan, app, ua_sess, ua_chan);
+ ret = send_channel_uid_to_ust(buf_reg_chan, app, ua_sess, ua_chan);
if (ret < 0) {
if (ret != -ENOTCONN) {
ERR("Error sending channel to application");
enum lttng_error_code cmd_ret;
struct ltt_session *session = NULL;
uint64_t chan_reg_key;
- struct ust_registry_channel *chan_reg;
+ struct ust_registry_channel *ust_reg_chan;
assert(app);
assert(usess);
chan_reg_key = ua_chan->key;
pthread_mutex_lock(®istry->lock);
- chan_reg = ust_registry_channel_find(registry, chan_reg_key);
- assert(chan_reg);
- chan_reg->consumer_key = ua_chan->key;
+ ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key);
+ assert(ust_reg_chan);
+ ust_reg_chan->consumer_key = ua_chan->key;
pthread_mutex_unlock(®istry->lock);
cmd_ret = notification_thread_command_add_channel(
- notification_thread_handle, session->name,
- lttng_credentials_get_uid(&ua_sess->effective_credentials),
- lttng_credentials_get_gid(&ua_sess->effective_credentials),
- ua_chan->name,
- ua_chan->key, LTTNG_DOMAIN_UST,
+ the_notification_thread_handle, session->name,
+ lttng_credentials_get_uid(
+ &ua_sess->effective_credentials),
+ lttng_credentials_get_gid(
+ &ua_sess->effective_credentials),
+ ua_chan->name, ua_chan->key, LTTNG_DOMAIN_UST,
ua_chan->attr.subbuf_size * ua_chan->attr.num_subbuf);
if (cmd_ret != LTTNG_OK) {
ret = - (int) cmd_ret;
*/
static int ust_app_channel_allocate(struct ust_app_session *ua_sess,
struct ltt_ust_channel *uchan,
- enum lttng_ust_chan_type type, struct ltt_ust_session *usess,
+ enum lttng_ust_abi_chan_type type, struct ltt_ust_session *usess,
struct ust_app_channel **ua_chanp)
{
int ret = 0;
DBG2("UST app create token event rule completed: app = '%s' (ppid: %d), token = %" PRIu64,
app->name, app->ppid, lttng_trigger_get_tracer_token(trigger));
-end:
- return ret;
+ goto end;
error:
/* The RCU read side lock is already being held by the caller. */
delete_ust_app_event_notifier_rule(-1, ua_event_notifier_rule, app);
+end:
return ret;
}
DBG3("UST app creating application for socket %d", sock);
if ((msg->bits_per_long == 64 &&
- (uatomic_read(&ust_consumerd64_fd) == -EINVAL))
- || (msg->bits_per_long == 32 &&
- (uatomic_read(&ust_consumerd32_fd) == -EINVAL))) {
+ (uatomic_read(&the_ust_consumerd64_fd) ==
+ -EINVAL)) ||
+ (msg->bits_per_long == 32 &&
+ (uatomic_read(&the_ust_consumerd32_fd) ==
+ -EINVAL))) {
ERR("Registration failed: application \"%s\" (pid: %d) has "
"%d-bit long, but no consumerd for this size is available.\n",
msg->name, msg->pid, msg->bits_per_long);
assert(app);
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_tracer_version(app->sock, &app->version);
+ ret = lttng_ust_ctl_tracer_version(app->sock, &app->version);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
return ret;
}
+bool ust_app_supports_notifiers(const struct ust_app *app)
+{
+ return app->v_major >= 9;
+}
+
+bool ust_app_supports_counters(const struct ust_app *app)
+{
+ return app->v_major >= 9;
+}
+
/*
* Setup the base event notifier group.
*
{
int ret;
int event_pipe_write_fd;
- struct lttng_ust_object_data *event_notifier_group = NULL;
+ struct lttng_ust_abi_object_data *event_notifier_group = NULL;
enum lttng_error_code lttng_ret;
+ enum event_notifier_error_accounting_status event_notifier_error_accounting_status;
assert(app);
+ if (!ust_app_supports_notifiers(app)) {
+ ret = -ENOSYS;
+ goto error;
+ }
+
/* Get the write side of the pipe. */
event_pipe_write_fd = lttng_pipe_get_writefd(
app->event_notifier_group.event_pipe);
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_create_event_notifier_group(app->sock,
+ ret = lttng_ust_ctl_create_event_notifier_group(app->sock,
event_pipe_write_fd, &event_notifier_group);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
lttng_fd_put(LTTNG_FD_APPS, 1);
lttng_ret = notification_thread_command_add_tracer_event_source(
- notification_thread_handle,
- lttng_pipe_get_readfd(app->event_notifier_group.event_pipe),
+ the_notification_thread_handle,
+ lttng_pipe_get_readfd(
+ app->event_notifier_group.event_pipe),
LTTNG_DOMAIN_UST);
if (lttng_ret != LTTNG_OK) {
ERR("Failed to add tracer event source to notification thread");
/* Assign handle only when the complete setup is valid. */
app->event_notifier_group.object = event_notifier_group;
+
+ event_notifier_error_accounting_status =
+ event_notifier_error_accounting_register_app(app);
+ switch (event_notifier_error_accounting_status) {
+ case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK:
+ break;
+ case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_UNSUPPORTED:
+ DBG3("Failed to setup event notifier error accounting (application does not support notifier error accounting): app socket fd = %d, app name = '%s', app ppid = %d",
+ app->sock, app->name, (int) app->ppid);
+ ret = 0;
+ goto error_accounting;
+ case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_APP_DEAD:
+ DBG3("Failed to setup event notifier error accounting (application is dead): app socket fd = %d, app name = '%s', app ppid = %d",
+ app->sock, app->name, (int) app->ppid);
+ ret = 0;
+ goto error_accounting;
+ default:
+ ERR("Failed to setup event notifier error accounting for app");
+ ret = -1;
+ goto error_accounting;
+ }
+
return ret;
+error_accounting:
+ lttng_ret = notification_thread_command_remove_tracer_event_source(
+ the_notification_thread_handle,
+ lttng_pipe_get_readfd(
+ app->event_notifier_group.event_pipe));
+ if (lttng_ret != LTTNG_OK) {
+ ERR("Failed to remove application tracer event source from notification thread");
+ }
+
error:
- ustctl_release_object(app->sock, app->event_notifier_group.object);
+ lttng_ust_ctl_release_object(app->sock, app->event_notifier_group.object);
free(app->event_notifier_group.object);
+ app->event_notifier_group.object = NULL;
return ret;
}
rcu_read_lock();
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
- struct lttng_ust_tracepoint_iter uiter;
+ struct lttng_ust_abi_tracepoint_iter uiter;
health_code_update();
continue;
}
pthread_mutex_lock(&app->sock_lock);
- handle = ustctl_tracepoint_list(app->sock);
+ handle = lttng_ust_ctl_tracepoint_list(app->sock);
if (handle < 0) {
if (handle != -EPIPE && handle != -LTTNG_UST_ERR_EXITING) {
ERR("UST app list events getting handle failed for app pid %d",
continue;
}
- while ((ret = ustctl_tracepoint_list_get(app->sock, handle,
+ while ((ret = lttng_ust_ctl_tracepoint_list_get(app->sock, handle,
&uiter)) != -LTTNG_UST_ERR_NOENT) {
/* Handle ustctl error. */
if (ret < 0) {
break;
}
free(tmp_event);
- release_ret = ustctl_release_handle(app->sock, handle);
+ release_ret = lttng_ust_ctl_release_handle(app->sock, handle);
if (release_ret < 0 &&
release_ret != -LTTNG_UST_ERR_EXITING &&
release_ret != -EPIPE) {
PERROR("realloc ust app events");
free(tmp_event);
ret = -ENOMEM;
- release_ret = ustctl_release_handle(app->sock, handle);
+ release_ret = lttng_ust_ctl_release_handle(app->sock, handle);
if (release_ret < 0 &&
release_ret != -LTTNG_UST_ERR_EXITING &&
release_ret != -EPIPE) {
nbmem = new_nbmem;
tmp_event = new_tmp_event;
}
- memcpy(tmp_event[count].name, uiter.name, LTTNG_UST_SYM_NAME_LEN);
+ memcpy(tmp_event[count].name, uiter.name, LTTNG_UST_ABI_SYM_NAME_LEN);
tmp_event[count].loglevel = uiter.loglevel;
- tmp_event[count].type = (enum lttng_event_type) LTTNG_UST_TRACEPOINT;
+ tmp_event[count].type = (enum lttng_event_type) LTTNG_UST_ABI_TRACEPOINT;
tmp_event[count].pid = app->pid;
tmp_event[count].enabled = -1;
count++;
}
- ret = ustctl_release_handle(app->sock, handle);
+ ret = lttng_ust_ctl_release_handle(app->sock, handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
ERR("Error releasing app handle for app %d with ret %d", app->sock, ret);
rcu_read_lock();
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
- struct lttng_ust_field_iter uiter;
+ struct lttng_ust_abi_field_iter uiter;
health_code_update();
continue;
}
pthread_mutex_lock(&app->sock_lock);
- handle = ustctl_tracepoint_field_list(app->sock);
+ handle = lttng_ust_ctl_tracepoint_field_list(app->sock);
if (handle < 0) {
if (handle != -EPIPE && handle != -LTTNG_UST_ERR_EXITING) {
ERR("UST app list field getting handle failed for app pid %d",
continue;
}
- while ((ret = ustctl_tracepoint_field_list_get(app->sock, handle,
+ while ((ret = lttng_ust_ctl_tracepoint_field_list_get(app->sock, handle,
&uiter)) != -LTTNG_UST_ERR_NOENT) {
/* Handle ustctl error. */
if (ret < 0) {
break;
}
free(tmp_event);
- release_ret = ustctl_release_handle(app->sock, handle);
+ release_ret = lttng_ust_ctl_release_handle(app->sock, handle);
pthread_mutex_unlock(&app->sock_lock);
if (release_ret < 0 &&
release_ret != -LTTNG_UST_ERR_EXITING &&
PERROR("realloc ust app event fields");
free(tmp_event);
ret = -ENOMEM;
- release_ret = ustctl_release_handle(app->sock, handle);
+ release_ret = lttng_ust_ctl_release_handle(app->sock, handle);
pthread_mutex_unlock(&app->sock_lock);
if (release_ret &&
release_ret != -LTTNG_UST_ERR_EXITING &&
tmp_event = new_tmp_event;
}
- memcpy(tmp_event[count].field_name, uiter.field_name, LTTNG_UST_SYM_NAME_LEN);
+ memcpy(tmp_event[count].field_name, uiter.field_name, LTTNG_UST_ABI_SYM_NAME_LEN);
/* Mapping between these enums matches 1 to 1. */
tmp_event[count].type = (enum lttng_event_field_type) uiter.type;
tmp_event[count].nowrite = uiter.nowrite;
- memcpy(tmp_event[count].event.name, uiter.event_name, LTTNG_UST_SYM_NAME_LEN);
+ memcpy(tmp_event[count].event.name, uiter.event_name, LTTNG_UST_ABI_SYM_NAME_LEN);
tmp_event[count].event.loglevel = uiter.loglevel;
tmp_event[count].event.type = LTTNG_EVENT_TRACEPOINT;
tmp_event[count].event.pid = app->pid;
tmp_event[count].event.enabled = -1;
count++;
}
- ret = ustctl_release_handle(app->sock, handle);
+ ret = lttng_ust_ctl_release_handle(app->sock, handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 &&
ret != -LTTNG_UST_ERR_EXITING &&
* configuration.
*/
ret = ust_app_channel_allocate(ua_sess, uchan,
- LTTNG_UST_CHAN_PER_CPU, usess,
+ LTTNG_UST_ABI_CHAN_PER_CPU, usess,
&ua_chan);
if (ret < 0) {
goto error;
skip_setup:
/* This starts the UST tracing */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_start_session(app->sock, ua_sess->handle);
+ ret = lttng_ust_ctl_start_session(app->sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
/* Quiescent wait after starting trace */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_wait_quiescent(app->sock);
+ ret = lttng_ust_ctl_wait_quiescent(app->sock);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app wait quiescent failed for app pid %d ret %d",
/* This inhibits UST tracing */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_stop_session(app->sock, ua_sess->handle);
+ ret = lttng_ust_ctl_stop_session(app->sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
/* Quiescent wait after stopping trace */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_wait_quiescent(app->sock);
+ ret = lttng_ust_ctl_wait_quiescent(app->sock);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app wait quiescent failed for app pid %d ret %d",
/* Flush all per UID buffers associated to that session. */
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
struct ust_registry_session *ust_session_reg;
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
struct consumer_socket *socket;
/* Get consumer socket to use to push the metadata.*/
}
cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
- reg_chan, node.node) {
+ buf_reg_chan, node.node) {
/*
* The following call will print error values so the return
* code is of little importance because whatever happens, we
* have to try them all.
*/
- (void) consumer_flush_channel(socket, reg_chan->consumer_key);
+ (void) consumer_flush_channel(socket, buf_reg_chan->consumer_key);
}
ust_session_reg = reg->registry->reg.ust;
*/
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
struct consumer_socket *socket;
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
/* Get associated consumer socket.*/
socket = consumer_find_socket_by_bitness(
}
cds_lfht_for_each_entry(reg->registry->channels->ht,
- &iter.iter, reg_chan, node.node) {
+ &iter.iter, buf_reg_chan, node.node) {
/*
* The following call will print error values so
* the return code is of little importance
* all.
*/
(void) consumer_clear_quiescent_channel(socket,
- reg_chan->consumer_key);
+ buf_reg_chan->consumer_key);
}
}
break;
/* Quiescent wait after stopping trace */
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_wait_quiescent(app->sock);
+ ret = lttng_ust_ctl_wait_quiescent(app->sock);
pthread_mutex_unlock(&app->sock_lock);
if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app wait quiescent failed for app pid %d ret %d",
struct ust_app_event_notifier_rule *event_notifier_rule;
unsigned int count, i;
+ if (!ust_app_supports_notifiers(app)) {
+ goto end;
+ }
+
/*
* Currrently, registering or unregistering a trigger with an
* event rule condition causes a full synchronization of the event
/* Get all triggers using uid 0 (root) */
ret_code = notification_thread_command_list_triggers(
- notification_thread_handle, 0, &triggers);
+ the_notification_thread_handle, 0, &triggers);
if (ret_code != LTTNG_OK) {
- ret = -1;
goto end;
}
t_status = lttng_triggers_get_count(triggers, &count);
if (t_status != LTTNG_TRIGGER_STATUS_OK) {
- ret = -1;
goto end;
}
token = lttng_trigger_get_tracer_token(trigger);
condition = lttng_trigger_get_condition(trigger);
- if (lttng_condition_get_type(condition) != LTTNG_CONDITION_TYPE_EVENT_RULE_HIT) {
+ if (lttng_condition_get_type(condition) !=
+ LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES) {
/* Does not apply */
continue;
}
- condition_status = lttng_condition_event_rule_borrow_rule_mutable(condition, &event_rule);
+ condition_status =
+ lttng_condition_event_rule_matches_borrow_rule_mutable(
+ condition, &event_rule);
assert(condition_status == LTTNG_CONDITION_STATUS_OK);
if (lttng_event_rule_get_domain_type(event_rule) == LTTNG_DOMAIN_KERNEL) {
}
/*
- * The caller must ensure that the application is compatible and is tracked
- * by the process attribute trackers.
+ * RCU read lock must be held by the caller.
*/
static
-void ust_app_synchronize(struct ltt_ust_session *usess,
+void ust_app_synchronize_all_channels(struct ltt_ust_session *usess,
+ struct ust_app_session *ua_sess,
struct ust_app *app)
{
int ret = 0;
struct cds_lfht_iter uchan_iter;
struct ltt_ust_channel *uchan;
- struct ust_app_session *ua_sess = NULL;
-
- /*
- * The application's configuration should only be synchronized for
- * active sessions.
- */
- assert(usess->active);
- ret = find_or_create_ust_app_session(usess, app, &ua_sess, NULL);
- if (ret < 0) {
- /* Tracer is probably gone or ENOMEM. */
- goto error;
- }
+ assert(usess);
assert(ua_sess);
-
- pthread_mutex_lock(&ua_sess->lock);
- if (ua_sess->deleted) {
- pthread_mutex_unlock(&ua_sess->lock);
- goto end;
- }
-
- rcu_read_lock();
+ assert(app);
cds_lfht_for_each_entry(usess->domain_global.channels->ht, &uchan_iter,
uchan, node.node) {
app, uchan, &ua_chan);
if (ret) {
/* Tracer is probably gone or ENOMEM. */
- goto error_unlock;
+ goto end;
}
if (!ua_chan) {
ret = ust_app_channel_synchronize_event(ua_chan,
uevent, ua_sess, app);
if (ret) {
- goto error_unlock;
+ goto end;
}
}
enable_ust_app_channel(ua_sess, uchan, app) :
disable_ust_app_channel(ua_sess, ua_chan, app);
if (ret) {
- goto error_unlock;
+ goto end;
}
}
}
+end:
+ return;
+}
+
+/*
+ * The caller must ensure that the application is compatible and is tracked
+ * by the process attribute trackers.
+ */
+static
+void ust_app_synchronize(struct ltt_ust_session *usess,
+ struct ust_app *app)
+{
+ int ret = 0;
+ struct ust_app_session *ua_sess = NULL;
+
+ /*
+ * The application's configuration should only be synchronized for
+ * active sessions.
+ */
+ assert(usess->active);
+
+ ret = find_or_create_ust_app_session(usess, app, &ua_sess, NULL);
+ if (ret < 0) {
+ /* Tracer is probably gone or ENOMEM. */
+ if (ua_sess) {
+ destroy_app_session(app, ua_sess);
+ }
+ goto end;
+ }
+ assert(ua_sess);
+
+ pthread_mutex_lock(&ua_sess->lock);
+ if (ua_sess->deleted) {
+ goto deleted_session;
+ }
+
+ rcu_read_lock();
+
+ ust_app_synchronize_all_channels(usess, ua_sess, app);
/*
* Create the metadata for the application. This returns gracefully if a
*/
ret = create_ust_app_metadata(ua_sess, app, usess->consumer);
if (ret < 0) {
- goto error_unlock;
+ ERR("Metadata creation failed for app sock %d for session id %" PRIu64,
+ app->sock, usess->id);
}
rcu_read_unlock();
-end:
+deleted_session:
pthread_mutex_unlock(&ua_sess->lock);
- /* Everything went well at this point. */
- return;
-
-error_unlock:
- rcu_read_unlock();
- pthread_mutex_unlock(&ua_sess->lock);
-error:
- if (ua_sess) {
- destroy_app_session(app, ua_sess);
- }
+end:
return;
}
DBG2("UST application global event notifier rules update: app = '%s' (ppid: %d)",
app->name, app->ppid);
- if (!app->compatible) {
+ if (!app->compatible || !ust_app_supports_notifiers(app)) {
return;
}
assert(msg);
- ret = ustctl_recv_reg_msg(sock, &msg->type, &msg->major, &msg->minor,
+ ret = lttng_ust_ctl_recv_reg_msg(sock, &msg->type, &msg->major, &msg->minor,
&pid, &ppid, &uid, &gid,
&msg->bits_per_long,
&msg->uint8_t_alignment,
* On success 0 is returned else a negative value.
*/
static int reply_ust_register_channel(int sock, int cobjd,
- size_t nr_fields, struct ustctl_field *fields)
+ size_t nr_fields, struct lttng_ust_ctl_field *fields)
{
int ret, ret_code = 0;
uint32_t chan_id;
uint64_t chan_reg_key;
- enum ustctl_channel_header type;
+ enum lttng_ust_ctl_channel_header type;
struct ust_app *app;
struct ust_app_channel *ua_chan;
struct ust_app_session *ua_sess;
struct ust_registry_session *registry;
- struct ust_registry_channel *chan_reg;
+ struct ust_registry_channel *ust_reg_chan;
rcu_read_lock();
pthread_mutex_lock(®istry->lock);
- chan_reg = ust_registry_channel_find(registry, chan_reg_key);
- assert(chan_reg);
+ ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key);
+ assert(ust_reg_chan);
- if (!chan_reg->register_done) {
+ if (!ust_reg_chan->register_done) {
/*
* TODO: eventually use the registry event count for
* this channel to better guess header type for per-pid
* buffers.
*/
- type = USTCTL_CHANNEL_HEADER_LARGE;
- chan_reg->nr_ctx_fields = nr_fields;
- chan_reg->ctx_fields = fields;
+ type = LTTNG_UST_CTL_CHANNEL_HEADER_LARGE;
+ ust_reg_chan->nr_ctx_fields = nr_fields;
+ ust_reg_chan->ctx_fields = fields;
fields = NULL;
- chan_reg->header_type = type;
+ ust_reg_chan->header_type = type;
} else {
/* Get current already assigned values. */
- type = chan_reg->header_type;
+ type = ust_reg_chan->header_type;
}
/* Channel id is set during the object creation. */
- chan_id = chan_reg->chan_id;
+ chan_id = ust_reg_chan->chan_id;
/* Append to metadata */
- if (!chan_reg->metadata_dumped) {
- ret_code = ust_metadata_channel_statedump(registry, chan_reg);
+ if (!ust_reg_chan->metadata_dumped) {
+ ret_code = ust_metadata_channel_statedump(registry, ust_reg_chan);
if (ret_code) {
ERR("Error appending channel metadata (errno = %d)", ret_code);
goto reply;
" with id %u, type: %d, ret: %d", chan_reg_key, chan_id, type,
ret_code);
- ret = ustctl_reply_register_channel(sock, chan_id, type, ret_code);
+ ret = lttng_ust_ctl_reply_register_channel(sock, chan_id, type, ret_code);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app reply channel failed with ret %d", ret);
}
/* This channel registry registration is completed. */
- chan_reg->register_done = 1;
+ ust_reg_chan->register_done = 1;
error:
pthread_mutex_unlock(®istry->lock);
* On success 0 is returned else a negative value.
*/
static int add_event_ust_registry(int sock, int sobjd, int cobjd, char *name,
- char *sig, size_t nr_fields, struct ustctl_field *fields,
+ char *sig, size_t nr_fields, struct lttng_ust_ctl_field *fields,
int loglevel_value, char *model_emf_uri)
{
int ret, ret_code;
* application can be notified. In case of an error, it's important not to
* return a negative error or else the application will get closed.
*/
- ret = ustctl_reply_register_event(sock, event_id, ret_code);
+ ret = lttng_ust_ctl_reply_register_event(sock, event_id, ret_code);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app reply event failed with ret %d", ret);
* On success 0 is returned else a negative value.
*/
static int add_enum_ust_registry(int sock, int sobjd, char *name,
- struct ustctl_enum_entry *entries, size_t nr_entries)
+ struct lttng_ust_ctl_enum_entry *entries, size_t nr_entries)
{
int ret = 0, ret_code;
struct ust_app *app;
* application can be notified. In case of an error, it's important not to
* return a negative error or else the application will get closed.
*/
- ret = ustctl_reply_register_enum(sock, enum_id, ret_code);
+ ret = lttng_ust_ctl_reply_register_enum(sock, enum_id, ret_code);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app reply enum failed with ret %d", ret);
int ust_app_recv_notify(int sock)
{
int ret;
- enum ustctl_notify_cmd cmd;
+ enum lttng_ust_ctl_notify_cmd cmd;
DBG3("UST app receiving notify from sock %d", sock);
- ret = ustctl_recv_notify(sock, &cmd);
+ ret = lttng_ust_ctl_recv_notify(sock, &cmd);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
ERR("UST app recv notify failed with ret %d", ret);
}
switch (cmd) {
- case USTCTL_NOTIFY_CMD_EVENT:
+ case LTTNG_UST_CTL_NOTIFY_CMD_EVENT:
{
int sobjd, cobjd, loglevel_value;
- char name[LTTNG_UST_SYM_NAME_LEN], *sig, *model_emf_uri;
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN], *sig, *model_emf_uri;
size_t nr_fields;
- struct ustctl_field *fields;
+ struct lttng_ust_ctl_field *fields;
DBG2("UST app ustctl register event received");
- ret = ustctl_recv_register_event(sock, &sobjd, &cobjd, name,
+ ret = lttng_ust_ctl_recv_register_event(sock, &sobjd, &cobjd, name,
&loglevel_value, &sig, &nr_fields, &fields,
&model_emf_uri);
if (ret < 0) {
break;
}
- case USTCTL_NOTIFY_CMD_CHANNEL:
+ case LTTNG_UST_CTL_NOTIFY_CMD_CHANNEL:
{
int sobjd, cobjd;
size_t nr_fields;
- struct ustctl_field *fields;
+ struct lttng_ust_ctl_field *fields;
DBG2("UST app ustctl register channel received");
- ret = ustctl_recv_register_channel(sock, &sobjd, &cobjd, &nr_fields,
+ ret = lttng_ust_ctl_recv_register_channel(sock, &sobjd, &cobjd, &nr_fields,
&fields);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
break;
}
- case USTCTL_NOTIFY_CMD_ENUM:
+ case LTTNG_UST_CTL_NOTIFY_CMD_ENUM:
{
int sobjd;
- char name[LTTNG_UST_SYM_NAME_LEN];
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
size_t nr_entries;
- struct ustctl_enum_entry *entries;
+ struct lttng_ust_ctl_enum_entry *entries;
DBG2("UST app ustctl register enum received");
- ret = ustctl_recv_register_enum(sock, &sobjd, name,
+ ret = lttng_ust_ctl_recv_register_enum(sock, &sobjd, name,
&entries, &nr_entries);
if (ret < 0) {
if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
struct buffer_reg_uid *reg;
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
struct consumer_socket *socket;
char pathname[PATH_MAX];
size_t consumer_path_offset = 0;
memset(pathname, 0, sizeof(pathname));
ret = snprintf(pathname, sizeof(pathname),
- DEFAULT_UST_TRACE_DIR "/" DEFAULT_UST_TRACE_UID_PATH,
+ DEFAULT_UST_TRACE_UID_PATH,
reg->uid, reg->bits_per_long);
if (ret < 0) {
PERROR("snprintf snapshot path");
}
/* Add the UST default trace dir to path. */
cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
- reg_chan, node.node) {
+ buf_reg_chan, node.node) {
status = consumer_snapshot_channel(socket,
- reg_chan->consumer_key,
+ buf_reg_chan->consumer_key,
output, 0, usess->uid,
usess->gid, &trace_path[consumer_path_offset], wait,
nb_packets_per_stream);
/* Add the UST default trace dir to path. */
memset(pathname, 0, sizeof(pathname));
- ret = snprintf(pathname, sizeof(pathname), DEFAULT_UST_TRACE_DIR "/%s",
+ ret = snprintf(pathname, sizeof(pathname), "%s",
ua_sess->path);
if (ret < 0) {
status = LTTNG_ERR_INVALID;
struct buffer_reg_uid *reg;
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
rcu_read_lock();
cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
- reg_chan, node.node) {
- if (cur_nr_packets >= reg_chan->num_subbuf) {
+ buf_reg_chan, node.node) {
+ if (cur_nr_packets >= buf_reg_chan->num_subbuf) {
/*
* Don't take channel into account if we
* already grab all its packets.
*/
continue;
}
- tot_size += reg_chan->subbuf_size * reg_chan->stream_count;
+ tot_size += buf_reg_chan->subbuf_size * buf_reg_chan->stream_count;
}
rcu_read_unlock();
}
}
pthread_mutex_lock(&app->sock_lock);
- ret = ustctl_regenerate_statedump(app->sock, ua_sess->handle);
+ ret = lttng_ust_ctl_regenerate_statedump(app->sock, ua_sess->handle);
pthread_mutex_unlock(&app->sock_lock);
end_unlock:
struct buffer_reg_uid *reg;
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
struct consumer_socket *socket;
- if (!reg->registry->reg.ust->metadata_key) {
- /* Skip since no metadata is present */
- continue;
- }
-
/* Get consumer socket to use to push the metadata.*/
socket = consumer_find_socket_by_bitness(reg->bits_per_long,
usess->consumer);
/* Rotate the data channels. */
cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
- reg_chan, node.node) {
+ buf_reg_chan, node.node) {
ret = consumer_rotate_channel(socket,
- reg_chan->consumer_key,
+ buf_reg_chan->consumer_key,
usess->uid, usess->gid,
usess->consumer,
/* is_metadata_channel */ false);
}
}
+ /*
+ * The metadata channel might not be present.
+ *
+ * Consumer stream allocation can be done
+ * asynchronously and can fail on intermediary
+ * operations (i.e add context) and lead to data
+ * channels created with no metadata channel.
+ */
+ if (!reg->registry->reg.ust->metadata_key) {
+ /* Skip since no metadata is present. */
+ continue;
+ }
+
(void) push_metadata(reg->registry->reg.ust, usess->consumer);
ret = consumer_rotate_channel(socket,
struct buffer_reg_uid *reg;
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
struct consumer_socket *socket;
/* Get consumer socket to use to push the metadata.*/
/* Clear the data channels. */
cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
- reg_chan, node.node) {
+ buf_reg_chan, node.node) {
ret = consumer_clear_channel(socket,
- reg_chan->consumer_key);
+ buf_reg_chan->consumer_key);
if (ret < 0) {
goto error;
}
cds_list_for_each_entry (
reg, &usess->buffer_reg_uid_list, lnode) {
- struct buffer_reg_channel *reg_chan;
+ struct buffer_reg_channel *buf_reg_chan;
struct consumer_socket *socket;
socket = consumer_find_socket_by_bitness(
}
cds_lfht_for_each_entry(reg->registry->channels->ht,
- &iter.iter, reg_chan, node.node) {
+ &iter.iter, buf_reg_chan, node.node) {
const int open_ret =
consumer_open_channel_packets(
socket,
- reg_chan->consumer_key);
+ buf_reg_chan->consumer_key);
if (open_ret < 0) {
ret = LTTNG_ERR_UNK;