X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fwriter%2Fwriter.c;h=57236bd94186baa0c3e562cb1a49834191b39971;hb=2f100782231d86cdaaadf7a8568c5b28583800f4;hp=5600a92a0a1debd22cfed2066edf5ee16bfae825;hpb=1b8180b91647e07b243c472e1f0c6ae198f82585;p=babeltrace.git diff --git a/formats/ctf/writer/writer.c b/formats/ctf/writer/writer.c index 5600a92a..57236bd9 100644 --- a/formats/ctf/writer/writer.c +++ b/formats/ctf/writer/writer.c @@ -3,7 +3,7 @@ * * Babeltrace CTF Writer * - * Copyright 2013 EfficiOS Inc. + * Copyright 2013, 2014 Jérémie Galarneau * * Author: Jérémie Galarneau * @@ -28,11 +28,12 @@ #include #include -#include +#include #include -#include -#include +#include +#include #include +#include #include #include #include @@ -233,6 +234,7 @@ struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, goto error; } + for (i = 0; i < writer->stream_classes->len; i++) { if (writer->stream_classes->pdata[i] == stream->stream_class) { stream_class_found = 1; @@ -240,11 +242,21 @@ struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, } if (!stream_class_found) { - if (bt_ctf_stream_class_set_id(stream->stream_class, - writer->next_stream_id++)) { - goto error; + int64_t stream_id = bt_ctf_stream_class_get_id(stream_class); + if (stream_id < 0) { + if (bt_ctf_stream_class_set_id(stream->stream_class, + writer->next_stream_id++)) { + goto error; + } } + for (i = 0; i < writer->stream_classes->len; i++) { + if (stream_id == bt_ctf_stream_class_get_id( + writer->stream_classes->pdata[i])) { + /* Duplicate stream id found */ + goto error; + } + } bt_ctf_stream_class_get(stream->stream_class); g_ptr_array_add(writer->stream_classes, stream->stream_class); } @@ -357,7 +369,7 @@ const char *get_byte_order_string(int byte_order) } static -void append_trace_metadata(struct bt_ctf_writer *writer, +int append_trace_metadata(struct bt_ctf_writer *writer, struct metadata_context *context) { unsigned char *uuid = writer->uuid; @@ -382,10 +394,14 @@ void append_trace_metadata(struct bt_ctf_writer *writer, g_string_assign(context->field_name, ""); ret = bt_ctf_field_type_serialize(writer->trace_packet_header_type, context); - assert(!ret); + if (ret) { + goto end; + } context->current_indentation_level--; g_string_append(context->string, ";\n};\n\n"); +end: + return ret; } static @@ -429,7 +445,9 @@ char *bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer) context->field_name = g_string_sized_new(DEFAULT_IDENTIFIER_SIZE); context->string = g_string_sized_new(DEFAULT_METADATA_STRING_SIZE); g_string_append(context->string, "/* CTF 1.8 */\n\n"); - append_trace_metadata(writer, context); + if (append_trace_metadata(writer, context)) { + goto error; + } append_env_metadata(writer, context); g_ptr_array_foreach(writer->clocks, (GFunc)bt_ctf_clock_serialize, context); @@ -560,8 +578,9 @@ int validate_identifier(const char *input_string) token = strtok_r(string, " ", &save_ptr); while (token) { - if (g_hash_table_contains(reserved_keywords_set, - GINT_TO_POINTER(g_quark_from_string(token)))) { + if (g_hash_table_lookup_extended(reserved_keywords_set, + GINT_TO_POINTER(g_quark_from_string(token)), + NULL, NULL)) { ret = -1; goto end; } @@ -716,7 +735,7 @@ void stream_flush_cb(struct bt_ctf_stream *stream, struct bt_ctf_writer *writer) stream_id = bt_ctf_field_structure_get_field( writer->trace_packet_header, "stream_id"); - bt_ctf_field_unsigned_integer_set_value(stream_id, stream->id); + bt_ctf_field_unsigned_integer_set_value(stream_id, stream->stream_class->id); bt_ctf_field_put(stream_id); /* Write the trace_packet_header */ @@ -737,8 +756,10 @@ void writer_init(void) reserved_keywords_set = g_hash_table_new(g_direct_hash, g_direct_equal); for (i = 0; i < reserved_keywords_count; i++) { - g_hash_table_add(reserved_keywords_set, - GINT_TO_POINTER(g_quark_from_string(reserved_keywords_str[i]))); + gpointer quark = GINT_TO_POINTER(g_quark_from_string( + reserved_keywords_str[i])); + + g_hash_table_insert(reserved_keywords_set, quark, quark); } init_done = 1;