From 3487c9f3e9e3c1ab1e55488d1f81de56792ddbcf Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Sun, 1 Mar 2015 20:47:33 -0500 Subject: [PATCH] Support the addition of integer trace environment fields MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- formats/ctf/ir/trace.c | 65 +++++++++++++++++++--- include/babeltrace/ctf-ir/trace-internal.h | 7 ++- include/babeltrace/ctf-ir/trace.h | 30 +++++++++- 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/formats/ctf/ir/trace.c b/formats/ctf/ir/trace.c index 495df226..8d5f7270 100644 --- a/formats/ctf/ir/trace.c +++ b/formats/ctf/ir/trace.c @@ -226,6 +226,7 @@ int bt_ctf_trace_add_environment_field(struct bt_ctf_trace *trace, goto error; } + var->type = BT_ENVIRONMENT_FIELD_TYPE_STRING; escaped_value = g_strescape(value, NULL); if (!escaped_value) { ret = -1; @@ -233,9 +234,9 @@ int bt_ctf_trace_add_environment_field(struct bt_ctf_trace *trace, } var->name = g_string_new(name); - var->value = g_string_new(escaped_value); + var->value.string = g_string_new(escaped_value); g_free(escaped_value); - if (!var->name || !var->value) { + if (!var->name || !var->value.string) { ret = -1; goto error; } @@ -248,8 +249,46 @@ error: g_string_free(var->name, TRUE); } - if (var && var->value) { - g_string_free(var->value, TRUE); + if (var && var->value.string) { + g_string_free(var->value.string, TRUE); + } + + g_free(var); + return ret; +} + +int bt_ctf_trace_add_environment_field_integer(struct bt_ctf_trace *trace, + const char *name, + int64_t value) +{ + struct environment_variable *var = NULL; + int ret = 0; + + if (!trace || !name) { + ret = -1; + goto error; + } + + var = g_new0(struct environment_variable, 1); + if (!var) { + ret = -1; + goto error; + } + + var->type = BT_ENVIRONMENT_FIELD_TYPE_INTEGER; + var->name = g_string_new(name); + var->value.integer = value; + if (!var->name) { + ret = -1; + goto error; + } + + g_ptr_array_add(trace->environment, var); + return ret; + +error: + if (var && var->name) { + g_string_free(var->name, TRUE); } g_free(var); @@ -368,8 +407,18 @@ static void append_env_field_metadata(struct environment_variable *var, struct metadata_context *context) { - g_string_append_printf(context->string, "\t%s = \"%s\";\n", - var->name->str, var->value->str); + switch (var->type) { + case BT_ENVIRONMENT_FIELD_TYPE_STRING: + g_string_append_printf(context->string, "\t%s = \"%s\";\n", + var->name->str, var->value.string->str); + break; + case BT_ENVIRONMENT_FIELD_TYPE_INTEGER: + g_string_append_printf(context->string, "\t%s = %" PRId64 ";\n", + var->name->str, var->value.integer); + break; + default: + assert(0); + } } static @@ -602,6 +651,8 @@ static void environment_variable_destroy(struct environment_variable *var) { g_string_free(var->name, TRUE); - g_string_free(var->value, TRUE); + if (var->type == BT_ENVIRONMENT_FIELD_TYPE_STRING) { + g_string_free(var->value.string, TRUE); + } g_free(var); } diff --git a/include/babeltrace/ctf-ir/trace-internal.h b/include/babeltrace/ctf-ir/trace-internal.h index 19cdd361..2f738bd7 100644 --- a/include/babeltrace/ctf-ir/trace-internal.h +++ b/include/babeltrace/ctf-ir/trace-internal.h @@ -60,7 +60,12 @@ struct bt_ctf_trace { }; struct environment_variable { - GString *name, *value; + GString *name; + enum bt_environment_field_type type; + union { + GString *string; + int64_t integer; + } value; }; struct metadata_context { diff --git a/include/babeltrace/ctf-ir/trace.h b/include/babeltrace/ctf-ir/trace.h index 6a0148c6..f5f3415c 100644 --- a/include/babeltrace/ctf-ir/trace.h +++ b/include/babeltrace/ctf-ir/trace.h @@ -41,6 +41,12 @@ struct bt_ctf_stream; struct bt_ctf_stream_class; struct bt_ctf_clock; +enum bt_environment_field_type { + BT_ENVIRONMENT_FIELD_TYPE_UNKNOWN = -1, + BT_ENVIRONMENT_FIELD_TYPE_STRING = 0, + BT_ENVIRONMENT_FIELD_TYPE_INTEGER = 1, +}; + /* * bt_ctf_trace_create: create a trace instance. * @@ -72,10 +78,11 @@ extern struct bt_ctf_stream *bt_ctf_trace_create_stream( struct bt_ctf_stream_class *stream_class); /* - * bt_ctf_trace_add_environment_field: add an environment field to the trace. + * bt_ctf_trace_add_environment_field: add a string environment field to the + * trace. * - * Add an environment field to the trace. The name and value parameters are - * copied. + * Add a string environment field to the trace. The name and value parameters + * are copied. * * @param trace Trace instance. * @param name Name of the environment field (will be copied). @@ -87,6 +94,23 @@ extern int bt_ctf_trace_add_environment_field(struct bt_ctf_trace *trace, const char *name, const char *value); +/* + * bt_ctf_trace_add_environment_field_integer: add an integer environment + * field to the trace. + * + * Add an integer environment field to the trace. The name parameter is + * copied. + * + * @param trace Trace instance. + * @param name Name of the environment field (will be copied). + * @param value Value of the environment field. + * + * Returns 0 on success, a negative value on error. + */ +extern int bt_ctf_trace_add_environment_field_integer( + struct bt_ctf_trace *trace, const char *name, + int64_t value); + /* * bt_ctf_trace_add_clock: add a clock to the trace. * -- 2.34.1