goto error;
}
- ret = bt_ctf_stream_class_set_byte_order(stream_class,
- trace->byte_order == LITTLE_ENDIAN ?
- BT_CTF_BYTE_ORDER_LITTLE_ENDIAN : BT_CTF_BYTE_ORDER_BIG_ENDIAN);
- if (ret) {
- goto error;
- }
-
stream = bt_ctf_stream_create(stream_class, trace);
if (!stream) {
goto error;
bt_ctf_stream_get(stream);
g_ptr_array_add(trace->streams, stream);
+
+ /*
+ * Freeze the trace and its packet header.
+ *
+ * All field type byte orders set as "native" byte ordering can now be
+ * safely set to trace's own endianness, including the stream class'.
+ */
+ bt_ctf_field_type_set_native_byte_order(trace->packet_header_type,
+ trace->byte_order);
+ ret = bt_ctf_stream_class_set_byte_order(stream_class,
+ trace->byte_order == LITTLE_ENDIAN ?
+ BT_CTF_BYTE_ORDER_LITTLE_ENDIAN : BT_CTF_BYTE_ORDER_BIG_ENDIAN);
+ if (ret) {
+ goto error;
+ }
+
+ bt_ctf_stream_class_freeze(stream_class);
trace->frozen = 1;
return stream;
-
error:
bt_ctf_stream_put(stream);
return NULL;
goto error;
}
+ var->type = BT_ENVIRONMENT_FIELD_TYPE_STRING;
escaped_value = g_strescape(value, NULL);
if (!escaped_value) {
ret = -1;
}
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;
}
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);
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
switch (byte_order) {
case BT_CTF_BYTE_ORDER_NATIVE:
- internal_byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ?
+ /*
+ * This doesn't make sense since the CTF specification defines
+ * the "native" byte order as "the byte order described in the
+ * trace description". However, this behavior had been
+ * implemented as part of v1.2 and is kept to maintain
+ * compatibility.
+ *
+ * This may be changed on a major version bump only.
+ */
+ internal_byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ?
LITTLE_ENDIAN : BIG_ENDIAN;
break;
case BT_CTF_BYTE_ORDER_LITTLE_ENDIAN:
}
trace->byte_order = internal_byte_order;
- if (trace->packet_header_type) {
- init_trace_packet_header(trace);
- }
end:
return ret;
}
goto end;
}
- ret = bt_ctf_field_type_set_byte_order(_uint32_t,
- (trace->byte_order == LITTLE_ENDIAN ?
- BT_CTF_BYTE_ORDER_LITTLE_ENDIAN :
- BT_CTF_BYTE_ORDER_BIG_ENDIAN));
- if (ret) {
- goto end;
- }
-
ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type,
_uint32_t, "magic");
if (ret) {
goto end;
}
- bt_ctf_field_type_put(trace->packet_header_type);
- trace->packet_header_type = trace_packet_header_type;
+ ret = bt_ctf_trace_set_packet_header_type(trace,
+ trace_packet_header_type);
+ if (ret) {
+ goto end;
+ }
end:
bt_ctf_field_type_put(uuid_array_type);
bt_ctf_field_type_put(_uint32_t);
bt_ctf_field_type_put(_uint8_t);
bt_ctf_field_put(magic);
bt_ctf_field_put(uuid_array);
- if (ret) {
- bt_ctf_field_type_put(trace_packet_header_type);
- }
+ bt_ctf_field_type_put(trace_packet_header_type);
return ret;
}
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);
}