X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-context.c;h=6cab7dc1721a57dbbd004cd84f5db4deed32072b;hb=5ea386c3b8e3566ec0b6710c82aae433de4d944a;hp=fc2ab4f570b8182ef69f44a8e3375e5adcde1630;hpb=77aa5901fd3f09001fb7e78f3533cf58c6d345e5;p=lttng-ust.git diff --git a/liblttng-ust/lttng-context.c b/liblttng-ust/lttng-context.c index fc2ab4f5..6cab7dc1 100644 --- a/liblttng-ust/lttng-context.c +++ b/liblttng-ust/lttng-context.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -32,6 +33,11 @@ * same context performed by the same thread return the same result. */ +/* + * Static array of contexts, for $ctx filters. + */ +struct lttng_ctx *lttng_static_ctx; + int lttng_find_context(struct lttng_ctx *ctx, const char *name) { unsigned int i; @@ -74,6 +80,7 @@ struct lttng_ctx_field *lttng_append_context(struct lttng_ctx **ctx_p) *ctx_p = zmalloc(sizeof(struct lttng_ctx)); if (!*ctx_p) return NULL; + (*ctx_p)->largest_align = 1; } ctx = *ctx_p; if (ctx->nr_fields + 1 > ctx->allocated_fields) { @@ -93,6 +100,94 @@ struct lttng_ctx_field *lttng_append_context(struct lttng_ctx **ctx_p) return field; } +/* + * lttng_context_update() should be called at least once between context + * modification and trace start. + */ +void lttng_context_update(struct lttng_ctx *ctx) +{ + int i; + size_t largest_align = 8; /* in bits */ + + for (i = 0; i < ctx->nr_fields; i++) { + struct lttng_type *type; + size_t field_align = 8; + + type = &ctx->fields[i].event_field.type; + switch (type->atype) { + case atype_integer: + field_align = type->u.basic.integer.alignment; + break; + case atype_array: + { + struct lttng_basic_type *btype; + + btype = &type->u.array.elem_type; + switch (btype->atype) { + case atype_integer: + field_align = btype->u.basic.integer.alignment; + break; + case atype_string: + break; + + case atype_array: + case atype_sequence: + default: + WARN_ON_ONCE(1); + break; + } + break; + } + case atype_sequence: + { + struct lttng_basic_type *btype; + + btype = &type->u.sequence.length_type; + switch (btype->atype) { + case atype_integer: + field_align = btype->u.basic.integer.alignment; + break; + + case atype_string: + case atype_array: + case atype_sequence: + default: + WARN_ON_ONCE(1); + break; + } + + btype = &type->u.sequence.elem_type; + switch (btype->atype) { + case atype_integer: + field_align = max_t(size_t, + field_align, + btype->u.basic.integer.alignment); + break; + + case atype_string: + break; + + case atype_array: + case atype_sequence: + default: + WARN_ON_ONCE(1); + break; + } + break; + } + case atype_string: + break; + + case atype_enum: + default: + WARN_ON_ONCE(1); + break; + } + largest_align = max_t(size_t, largest_align, field_align); + } + ctx->largest_align = largest_align >> 3; /* bits to bytes */ +} + /* * Remove last context field. */ @@ -120,3 +215,31 @@ void lttng_destroy_context(struct lttng_ctx *ctx) free(ctx->fields); free(ctx); } + +void lttng_context_init(void) +{ + int ret; + + ret = lttng_add_pthread_id_to_ctx(<tng_static_ctx); + if (ret) { + WARN("Cannot add context lttng_add_pthread_id_to_ctx"); + } + ret = lttng_add_vtid_to_ctx(<tng_static_ctx); + if (ret) { + WARN("Cannot add context lttng_add_vtid_to_ctx"); + } + ret = lttng_add_vpid_to_ctx(<tng_static_ctx); + if (ret) { + WARN("Cannot add context lttng_add_vpid_to_ctx"); + } + ret = lttng_add_procname_to_ctx(<tng_static_ctx); + if (ret) { + WARN("Cannot add context lttng_add_procname_to_ctx"); + } +} + +void lttng_context_exit(void) +{ + lttng_destroy_context(lttng_static_ctx); + lttng_static_ctx = NULL; +}