*
* Babeltrace CTF Writer
*
- * Copyright 2013 EfficiOS Inc.
+ * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
* Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
#include <babeltrace/ctf-writer/writer.h>
#include <babeltrace/ctf-writer/clock.h>
-#include <babeltrace/ctf-writer/clock-internal.h>
+#include <babeltrace/ctf-ir/clock-internal.h>
#include <babeltrace/ctf-writer/writer-internal.h>
-#include <babeltrace/ctf-writer/event-types-internal.h>
-#include <babeltrace/ctf-writer/event-fields-internal.h>
+#include <babeltrace/ctf-ir/event-types-internal.h>
+#include <babeltrace/ctf-ir/event-fields-internal.h>
#include <babeltrace/ctf-writer/functor-internal.h>
+#include <babeltrace/ctf-ir/stream-class-internal.h>
#include <babeltrace/ctf-writer/stream-internal.h>
#include <babeltrace/ctf-writer/stream.h>
#include <babeltrace/compiler.h>
goto error_destroy;
}
- writer->trace_dir_fd = open(path, O_RDONLY | O_DIRECTORY,
- S_IRWXU | S_IRWXG);
+ writer->trace_dir_fd = open(path, O_RDONLY, S_IRWXU | S_IRWXG);
if (writer->trace_dir_fd < 0) {
perror("open");
goto error_destroy;
}
if (writer->trace_dir_fd > 0) {
- close(writer->trace_dir_fd);
+ if (close(writer->trace_dir_fd)) {
+ perror("close");
+ abort();
+ }
}
if (writer->metadata_fd > 0) {
- close(writer->metadata_fd);
+ if (close(writer->metadata_fd)) {
+ perror("close");
+ abort();
+ }
}
if (writer->environment) {
goto error;
}
+
for (i = 0; i < writer->stream_classes->len; i++) {
if (writer->stream_classes->pdata[i] == stream->stream_class) {
stream_class_found = 1;
}
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);
}
}
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;
+ int ret;
g_string_append(context->string, "trace {\n");
g_string_append(context->string, "\tpacket.header := ");
context->current_indentation_level++;
g_string_assign(context->field_name, "");
- bt_ctf_field_type_serialize(writer->trace_packet_header_type, context);
+ ret = bt_ctf_field_type_serialize(writer->trace_packet_header_type,
+ context);
+ if (ret) {
+ goto end;
+ }
context->current_indentation_level--;
g_string_append(context->string, ";\n};\n\n");
+end:
+ return ret;
}
static
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);
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;
}
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 */
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;