X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-context-callstack.c;h=eaaecf4d7dc1d64fddf00932fc26eb03f453776b;hb=d053f3eecd81fad0189e12f9f63a6095d421d5d8;hp=7b9e651272e4c3e5271928b8f051f96552401ba8;hpb=cfa6cc1d0f01c2cfcc1a679abf3a6572d411c309;p=lttng-modules.git diff --git a/src/lttng-context-callstack.c b/src/lttng-context-callstack.c index 7b9e6512..eaaecf4d 100644 --- a/src/lttng-context-callstack.c +++ b/src/lttng-context-callstack.c @@ -105,6 +105,7 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx, const char *ctx_name = lttng_cs_ctx_mode_name(mode); const char *ctx_length_name = lttng_cs_ctx_mode_length_name(mode); struct lttng_ctx_field *length_field, *sequence_field; + ssize_t length_index, sequence_index; struct lttng_event_field *field; struct field_data *fdata; int ret; @@ -112,18 +113,22 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx, ret = init_type(mode); if (ret) return ret; - length_field = lttng_append_context(ctx); - if (!length_field) - return -ENOMEM; - sequence_field = lttng_append_context(ctx); - if (!sequence_field) { - lttng_remove_context_field(ctx, length_field); - return -ENOMEM; + if (lttng_find_context(*ctx, ctx_name)) + return -EEXIST; + length_index = lttng_append_context_index(ctx); + if (length_index < 0) { + ret = -ENOMEM; + goto error_length; } - if (lttng_find_context(*ctx, ctx_name)) { - ret = -EEXIST; - goto error_find; + sequence_index = lttng_append_context_index(ctx); + if (sequence_index < 0) { + ret = -ENOMEM; + goto error_sequence; } + length_field = lttng_get_context_field_from_index(*ctx, length_index); + WARN_ON_ONCE(!length_field); + sequence_field = lttng_get_context_field_from_index(*ctx, sequence_index); + WARN_ON_ONCE(!sequence_field); fdata = field_data_create(mode); if (!fdata) { ret = -ENOMEM; @@ -141,10 +146,12 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx, field->type.u.integer.encoding = lttng_encode_none; length_field->get_size_arg = lttng_callstack_length_get_size; length_field->record = lttng_callstack_length_record; + length_field->priv = fdata; field = &sequence_field->event_field; field->name = ctx_name; field->type.atype = atype_sequence_nestable; + field->type.u.sequence_nestable.length_name = ctx_length_name; field->type.u.sequence_nestable.elem_type = &sequence_elem_type; field->type.u.sequence_nestable.alignment = 0; sequence_field->get_size_arg = lttng_callstack_sequence_get_size; @@ -156,10 +163,10 @@ int __lttng_add_callstack_generic(struct lttng_ctx **ctx, return 0; error_create: - field_data_free(fdata); -error_find: - lttng_remove_context_field(ctx, sequence_field); - lttng_remove_context_field(ctx, length_field); + lttng_remove_context_field_index(ctx, sequence_index); +error_sequence: + lttng_remove_context_field_index(ctx, length_index); +error_length: return ret; }