X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fctf-writer%2Fwriter.c;h=b51dd7fff7244dd4329f5f2b9c68f1accd2a97c4;hb=3dca22768a95bef664012559aa9ac977091de6ac;hp=e9d747317825f7c0ec69fa0282c5fc90775a6346;hpb=9ac68eb139149d2768848dae5e263cc5a755d439;p=babeltrace.git diff --git a/lib/ctf-writer/writer.c b/lib/ctf-writer/writer.c index e9d74731..b51dd7ff 100644 --- a/lib/ctf-writer/writer.c +++ b/lib/ctf-writer/writer.c @@ -26,17 +26,22 @@ * SOFTWARE. */ +#define BT_LOG_TAG "CTF-WRITER" +#include + #include -#include -#include -#include +#include +#include #include -#include -#include -#include +#include +#include +#include +#include #include #include #include +#include +#include #include #include #include @@ -48,10 +53,61 @@ static void bt_ctf_writer_destroy(struct bt_object *obj); +static +int init_trace_packet_header(struct bt_ctf_trace *trace) +{ + int ret = 0; + struct bt_ctf_field_type *_uint32_t = + get_field_type(FIELD_TYPE_ALIAS_UINT32_T); + struct bt_ctf_field_type *_uint8_t = + get_field_type(FIELD_TYPE_ALIAS_UINT8_T); + struct bt_ctf_field_type *trace_packet_header_type = + bt_ctf_field_type_structure_create(); + struct bt_ctf_field_type *uuid_array_type = + bt_ctf_field_type_array_create(_uint8_t, 16); + + if (!trace_packet_header_type || !uuid_array_type) { + ret = -1; + goto end; + } + + ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type, + _uint32_t, "magic"); + if (ret) { + goto end; + } + + ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type, + uuid_array_type, "uuid"); + if (ret) { + goto end; + } + + ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type, + _uint32_t, "stream_id"); + if (ret) { + goto end; + } + + ret = bt_ctf_trace_set_packet_header_field_type(trace, + trace_packet_header_type); + if (ret) { + goto end; + } +end: + bt_put(uuid_array_type); + bt_put(_uint32_t); + bt_put(_uint8_t); + bt_put(trace_packet_header_type); + return ret; +} + struct bt_ctf_writer *bt_ctf_writer_create(const char *path) { int ret; struct bt_ctf_writer *writer = NULL; + unsigned char uuid[16]; + char *metadata_path = NULL; if (!path) { goto error; @@ -62,6 +118,8 @@ struct bt_ctf_writer *bt_ctf_writer_create(const char *path) goto error; } + metadata_path = g_build_filename(path, "metadata", NULL); + bt_object_init(writer, bt_ctf_writer_destroy); writer->path = g_string_new(path); if (!writer->path) { @@ -73,13 +131,29 @@ struct bt_ctf_writer *bt_ctf_writer_create(const char *path) goto error_destroy; } - writer->trace->is_created_by_writer = 1; + ret = init_trace_packet_header(writer->trace); + if (ret) { + goto error_destroy; + } + + /* Generate a UUID for this writer's trace */ + ret = bt_uuid_generate(uuid); + if (ret) { + BT_LOGE_STR("Cannot generate UUID for CTF writer's trace."); + goto error_destroy; + } + + ret = bt_ctf_trace_set_uuid(writer->trace, uuid); + if (ret) { + goto error_destroy; + } + bt_object_set_parent(writer->trace, writer); bt_put(writer->trace); /* Default to little-endian */ ret = bt_ctf_writer_set_byte_order(writer, BT_CTF_BYTE_ORDER_NATIVE); - assert(ret == 0); + BT_ASSERT(ret == 0); /* Create trace directory if necessary and open a metadata file */ if (g_mkdir_with_parents(path, S_IRWXU | S_IRWXG)) { @@ -87,22 +161,21 @@ struct bt_ctf_writer *bt_ctf_writer_create(const char *path) goto error_destroy; } - writer->trace_dir_fd = open(path, O_RDONLY, S_IRWXU | S_IRWXG); - if (writer->trace_dir_fd < 0) { + writer->metadata_fd = open(metadata_path, + O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); + if (writer->metadata_fd < 0) { perror("open"); goto error_destroy; } - writer->metadata_fd = openat(writer->trace_dir_fd, "metadata", - O_WRONLY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); - + g_free(metadata_path); return writer; error_destroy: - unlinkat(writer->trace_dir_fd, "metadata", 0); BT_PUT(writer); error: + g_free(metadata_path); return writer; } @@ -116,12 +189,6 @@ void bt_ctf_writer_destroy(struct bt_object *obj) g_string_free(writer->path, TRUE); } - if (writer->trace_dir_fd > 0) { - if (close(writer->trace_dir_fd)) { - perror("close"); - } - } - if (writer->metadata_fd > 0) { if (close(writer->metadata_fd)) { perror("close"); @@ -151,7 +218,7 @@ struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, { struct bt_ctf_stream *stream = NULL; int stream_class_count; - bool stream_class_found = false; + bt_bool stream_class_found = BT_FALSE; int i; if (!writer || !stream_class) { @@ -170,7 +237,7 @@ struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, writer->trace, i); if (existing_stream_class == stream_class) { - stream_class_found = true; + stream_class_found = BT_TRUE; } BT_PUT(existing_stream_class); @@ -189,7 +256,7 @@ struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, } } - stream = bt_ctf_stream_create(stream_class, NULL); + stream = bt_ctf_stream_create_with_id(stream_class, NULL, -1ULL); if (!stream) { goto error; } @@ -306,7 +373,7 @@ int bt_ctf_writer_set_byte_order(struct bt_ctf_writer *writer, } if (byte_order == BT_CTF_BYTE_ORDER_NATIVE) { - byte_order = BT_CTF_MY_BYTE_ORDER; + byte_order = (int) BT_MY_BYTE_ORDER; } ret = bt_ctf_trace_set_native_byte_order(writer->trace, @@ -315,18 +382,70 @@ end: return ret; } -void bt_ctf_writer_get(struct bt_ctf_writer *writer) +BT_HIDDEN +void bt_ctf_writer_freeze(struct bt_ctf_writer *writer) { - bt_get(writer); + writer->frozen = 1; } -void bt_ctf_writer_put(struct bt_ctf_writer *writer) +static +const unsigned int field_type_aliases_alignments[] = { + [FIELD_TYPE_ALIAS_UINT5_T] = 1, + [FIELD_TYPE_ALIAS_UINT8_T ... FIELD_TYPE_ALIAS_UINT16_T] = 8, + [FIELD_TYPE_ALIAS_UINT27_T] = 1, + [FIELD_TYPE_ALIAS_UINT32_T ... FIELD_TYPE_ALIAS_UINT64_T] = 8, +}; + +static +const unsigned int field_type_aliases_sizes[] = { + [FIELD_TYPE_ALIAS_UINT5_T] = 5, + [FIELD_TYPE_ALIAS_UINT8_T] = 8, + [FIELD_TYPE_ALIAS_UINT16_T] = 16, + [FIELD_TYPE_ALIAS_UINT27_T] = 27, + [FIELD_TYPE_ALIAS_UINT32_T] = 32, + [FIELD_TYPE_ALIAS_UINT64_T] = 64, +}; + +BT_HIDDEN +struct bt_ctf_field_type *get_field_type(enum field_type_alias alias) { - bt_put(writer); + int ret; + unsigned int alignment, size; + struct bt_ctf_field_type *field_type = NULL; + + if (alias >= NR_FIELD_TYPE_ALIAS) { + goto end; + } + + alignment = field_type_aliases_alignments[alias]; + size = field_type_aliases_sizes[alias]; + field_type = bt_ctf_field_type_integer_create(size); + ret = bt_ctf_field_type_set_alignment(field_type, alignment); + if (ret) { + BT_PUT(field_type); + } +end: + return field_type; } BT_HIDDEN -void bt_ctf_writer_freeze(struct bt_ctf_writer *writer) +const char *get_byte_order_string(enum bt_byte_order byte_order) { - writer->frozen = 1; + const char *string; + + switch (byte_order) { + case BT_BYTE_ORDER_LITTLE_ENDIAN: + string = "le"; + break; + case BT_BYTE_ORDER_BIG_ENDIAN: + string = "be"; + break; + case BT_BYTE_ORDER_NATIVE: + string = "native"; + break; + default: + abort(); + } + + return string; }