event = caa_container_of(node, struct ltt_ust_event, node.node);
key = _key;
- /* Match the 3 elements of the key: name, filter and loglevel. */
+ /* Match the 4 elements of the key: name, filter, loglevel, exclusions. */
/* Event name */
if (strncmp(event->attr.name, key->name, sizeof(event->attr.name)) != 0) {
}
}
+ /* If only one of the exclusions is NULL, fail. */
+ if ((key->exclusion && !event->exclusion) || (!key->exclusion && event->exclusion)) {
+ goto no_match;
+ }
+
+ if (key->exclusion && event->exclusion) {
+ /* Both exclusions exist; check count followed by names. */
+ if (event->exclusion->count != key->exclusion->count ||
+ memcmp(event->exclusion->names, key->exclusion->names,
+ event->exclusion->count * LTTNG_SYMBOL_NAME_LEN) != 0) {
+ goto no_match;
+ }
+ }
/* Match. */
return 1;
* MUST be acquired before calling this.
*/
struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht,
- char *name, struct lttng_filter_bytecode *filter, int loglevel)
+ char *name, struct lttng_filter_bytecode *filter, int loglevel,
+ struct lttng_event_exclusion *exclusion)
{
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
key.name = name;
key.filter = filter;
key.loglevel = loglevel;
+ key.exclusion = exclusion;
cds_lfht_lookup(ht->ht, ht->hash_fct((void *) name, lttng_ht_seed),
trace_ust_ht_match_event, &key, &iter.iter);
/* Init data structure */
lus->id = session_id;
- lus->start_trace = 0;
+ lus->active = 0;
+
+ /* Set default metadata channel attribute. */
+ lus->metadata_attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
+ lus->metadata_attr.subbuf_size = default_get_metadata_subbuf_size();
+ lus->metadata_attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM;
+ lus->metadata_attr.switch_timer_interval = DEFAULT_METADATA_SWITCH_TIMER;
+ lus->metadata_attr.read_timer_interval = DEFAULT_METADATA_READ_TIMER;
+ lus->metadata_attr.output = LTTNG_UST_MMAP;
/*
* Default buffer type. This can be changed through an enable channel
* Return pointer to structure or NULL.
*/
struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev,
- struct lttng_filter_bytecode *filter)
+ char *filter_expression,
+ struct lttng_filter_bytecode *filter,
+ struct lttng_event_exclusion *exclusion)
{
struct ltt_ust_event *lue;
}
/* Same layout. */
+ lue->filter_expression = filter_expression;
lue->filter = (struct lttng_ust_filter_bytecode *) filter;
+ lue->exclusion = (struct lttng_event_exclusion *) exclusion;
/* Init node */
lttng_ht_node_init_str(&lue->node, lue->attr.name);
return NULL;
}
+static
+int trace_ust_context_type_event_to_ust(enum lttng_event_context_type type)
+{
+ int utype;
+
+ switch (type) {
+ case LTTNG_EVENT_CONTEXT_VTID:
+ utype = LTTNG_UST_CONTEXT_VTID;
+ break;
+ case LTTNG_EVENT_CONTEXT_VPID:
+ utype = LTTNG_UST_CONTEXT_VPID;
+ break;
+ case LTTNG_EVENT_CONTEXT_PTHREAD_ID:
+ utype = LTTNG_UST_CONTEXT_PTHREAD_ID;
+ break;
+ case LTTNG_EVENT_CONTEXT_PROCNAME:
+ utype = LTTNG_UST_CONTEXT_PROCNAME;
+ break;
+ case LTTNG_EVENT_CONTEXT_IP:
+ utype = LTTNG_UST_CONTEXT_IP;
+ break;
+ case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
+ utype = LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER;
+ break;
+ default:
+ ERR("Invalid UST context");
+ utype = -1;
+ break;
+ }
+ return utype;
+}
+
/*
- * Allocate and initialize a ust metadata.
- *
- * Return pointer to structure or NULL.
+ * Return 1 if contexts match, 0 otherwise.
*/
-struct ltt_ust_metadata *trace_ust_create_metadata(char *path)
+int trace_ust_match_context(struct ltt_ust_context *uctx,
+ struct lttng_event_context *ctx)
{
- int ret;
- struct ltt_ust_metadata *lum;
+ int utype;
- assert(path);
-
- lum = zmalloc(sizeof(struct ltt_ust_metadata));
- if (lum == NULL) {
- PERROR("ust metadata zmalloc");
- goto error;
+ utype = trace_ust_context_type_event_to_ust(ctx->ctx);
+ if (utype < 0) {
+ return 0;
}
-
- /* Set default attributes */
- lum->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
- lum->attr.subbuf_size = default_get_metadata_subbuf_size();
- lum->attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM;
- lum->attr.switch_timer_interval = DEFAULT_METADATA_SWITCH_TIMER;
- lum->attr.read_timer_interval = DEFAULT_METADATA_READ_TIMER;
- lum->attr.output = LTTNG_UST_MMAP;
-
- lum->handle = -1;
- /* Set metadata trace path */
- ret = snprintf(lum->pathname, PATH_MAX, "%s/" DEFAULT_METADATA_NAME, path);
- if (ret < 0) {
- PERROR("asprintf ust metadata");
- goto error_free_metadata;
+ if (uctx->ctx.ctx != utype) {
+ return 0;
}
+ switch (utype) {
+ case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER:
+ if (uctx->ctx.u.perf_counter.type
+ != ctx->u.perf_counter.type) {
+ return 0;
+ }
+ if (uctx->ctx.u.perf_counter.config
+ != ctx->u.perf_counter.config) {
+ return 0;
+ }
+ if (strncmp(uctx->ctx.u.perf_counter.name,
+ ctx->u.perf_counter.name,
+ LTTNG_UST_SYM_NAME_LEN)) {
+ return 0;
+ }
+ break;
+ default:
+ break;
- return lum;
-
-error_free_metadata:
- free(lum);
-error:
- return NULL;
+ }
+ return 1;
}
/*
struct lttng_event_context *ctx)
{
struct ltt_ust_context *uctx;
- enum lttng_ust_context_type utype;
+ int utype;
assert(ctx);
- switch (ctx->ctx) {
- case LTTNG_EVENT_CONTEXT_VTID:
- utype = LTTNG_UST_CONTEXT_VTID;
- break;
- case LTTNG_EVENT_CONTEXT_VPID:
- utype = LTTNG_UST_CONTEXT_VPID;
- break;
- case LTTNG_EVENT_CONTEXT_PTHREAD_ID:
- utype = LTTNG_UST_CONTEXT_PTHREAD_ID;
- break;
- case LTTNG_EVENT_CONTEXT_PROCNAME:
- utype = LTTNG_UST_CONTEXT_PROCNAME;
- break;
- case LTTNG_EVENT_CONTEXT_IP:
- utype = LTTNG_UST_CONTEXT_IP;
- break;
- default:
- ERR("Invalid UST context");
+ utype = trace_ust_context_type_event_to_ust(ctx->ctx);
+ if (utype < 0) {
return NULL;
}
goto error;
}
- uctx->ctx.ctx = utype;
+ uctx->ctx.ctx = (enum lttng_ust_context_type) utype;
+ switch (utype) {
+ case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER:
+ uctx->ctx.u.perf_counter.type = ctx->u.perf_counter.type;
+ uctx->ctx.u.perf_counter.config = ctx->u.perf_counter.config;
+ strncpy(uctx->ctx.u.perf_counter.name, ctx->u.perf_counter.name,
+ LTTNG_UST_SYM_NAME_LEN);
+ uctx->ctx.u.perf_counter.name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0';
+ break;
+ default:
+ break;
+ }
lttng_ht_node_init_ulong(&uctx->node, (unsigned long) uctx->ctx.ctx);
- CDS_INIT_LIST_HEAD(&uctx->list);
return uctx;
assert(event);
DBG2("Trace destroy UST event %s", event->attr.name);
+ free(event->filter_expression);
free(event->filter);
+ free(event->exclusion);
free(event);
}
assert(!ret);
}
-/*
- * Cleanup ust metadata structure.
- */
-void trace_ust_destroy_metadata(struct ltt_ust_metadata *metadata)
-{
- assert(metadata);
-
- if (!metadata->handle) {
- return;
- }
- DBG2("Trace UST destroy metadata %d", metadata->handle);
- free(metadata);
-}
-
/*
* Iterate over a hash table containing channels and cleanup safely.
*/