/* 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,
+ char *filter_expression,
struct lttng_filter_bytecode *filter,
struct lttng_event_exclusion *exclusion)
{
}
/* Same layout. */
+ lue->filter_expression = filter_expression;
lue->filter = (struct lttng_ust_filter_bytecode *) filter;
lue->exclusion = (struct lttng_event_exclusion *) exclusion;
return NULL;
}
-/*
- * Allocate and initialize an UST context.
- *
- * Return pointer to structure or NULL.
- */
-struct ltt_ust_context *trace_ust_create_context(
- struct lttng_event_context *ctx)
+static
+int trace_ust_context_type_event_to_ust(enum lttng_event_context_type type)
{
- struct ltt_ust_context *uctx;
- enum lttng_ust_context_type utype;
-
- assert(ctx);
+ int utype;
- switch (ctx->ctx) {
+ switch (type) {
case LTTNG_EVENT_CONTEXT_VTID:
utype = LTTNG_UST_CONTEXT_VTID;
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;
+}
+
+/*
+ * Return 1 if contexts match, 0 otherwise.
+ */
+int trace_ust_match_context(struct ltt_ust_context *uctx,
+ struct lttng_event_context *ctx)
+{
+ int utype;
+
+ utype = trace_ust_context_type_event_to_ust(ctx->ctx);
+ if (utype < 0) {
+ return 0;
+ }
+ 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 1;
+}
+
+/*
+ * Allocate and initialize an UST context.
+ *
+ * Return pointer to structure or NULL.
+ */
+struct ltt_ust_context *trace_ust_create_context(
+ struct lttng_event_context *ctx)
+{
+ struct ltt_ust_context *uctx;
+ int utype;
+
+ assert(ctx);
+
+ 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);
}