X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fctf-writer%2Fstream.c;h=2242d977c2ac818d2430b1beaf1dd43deadb3fe0;hb=1353b066072e6c389ff35853bac83f65597e7a6a;hp=7d371ffd97a234781331191b318068857b572cc2;hpb=004090977e6698a39035bb20b5ba4d5da23a6718;p=babeltrace.git diff --git a/src/ctf-writer/stream.c b/src/ctf-writer/stream.c index 7d371ffd..2242d977 100644 --- a/src/ctf-writer/stream.c +++ b/src/ctf-writer/stream.c @@ -1,38 +1,23 @@ /* + * SPDX-License-Identifier: MIT + * * Copyright 2013, 2014 Jérémie Galarneau * Copyright 2017-2018 Philippe Proulx - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. */ #define BT_LOG_TAG "CTF-WRITER/STREAM" #include "logging.h" #include +#include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "common/align.h" #include "common/assert.h" @@ -48,7 +33,6 @@ #include "trace.h" #include "writer.h" -BT_HIDDEN void bt_ctf_stream_common_finalize(struct bt_ctf_stream_common *stream) { BT_LOGD("Finalizing common stream object: addr=%p, name=\"%s\"", @@ -59,7 +43,6 @@ void bt_ctf_stream_common_finalize(struct bt_ctf_stream_common *stream) } } -BT_HIDDEN int bt_ctf_stream_common_initialize( struct bt_ctf_stream_common *stream, struct bt_ctf_stream_class_common *stream_class, const char *name, @@ -146,7 +129,7 @@ static void bt_ctf_stream_destroy(struct bt_ctf_object *obj); static -int try_set_structure_field_integer(struct bt_ctf_field *, char *, uint64_t); +int try_set_structure_field_integer(struct bt_ctf_field *, const char *, uint64_t); static int set_integer_field_value(struct bt_ctf_field* field, uint64_t value) @@ -161,7 +144,7 @@ int set_integer_field_value(struct bt_ctf_field* field, uint64_t value) } field_type = bt_ctf_field_get_type(field); - BT_ASSERT(field_type); + BT_ASSERT_DBG(field_type); if (bt_ctf_field_type_get_type_id(field_type) != BT_CTF_FIELD_TYPE_ID_INTEGER) { @@ -207,7 +190,7 @@ int set_packet_header_magic(struct bt_ctf_stream *stream) stream->packet_header, "magic"); const uint32_t magic_value = 0xc1fc1fc1; - BT_ASSERT(stream); + BT_ASSERT_DBG(stream); if (!magic_field) { /* No magic field found. Not an error, skip. */ @@ -245,7 +228,7 @@ int set_packet_header_uuid(struct bt_ctf_stream *stream) struct bt_ctf_field *uuid_field = bt_ctf_field_structure_get_field_by_name( stream->packet_header, "uuid"); - BT_ASSERT(stream); + BT_ASSERT_DBG(stream); if (!uuid_field) { /* No uuid field found. Not an error, skip. */ @@ -395,7 +378,7 @@ int set_packet_context_content_size(struct bt_ctf_stream *stream, struct bt_ctf_field *field = bt_ctf_field_structure_get_field_by_name( stream->packet_context, "content_size"); - BT_ASSERT(stream); + BT_ASSERT_DBG(stream); if (!field) { /* No content size field found. Not an error, skip. */ @@ -430,7 +413,7 @@ int set_packet_context_events_discarded(struct bt_ctf_stream *stream) struct bt_ctf_field *field = bt_ctf_field_structure_get_field_by_name( stream->packet_context, "events_discarded"); - BT_ASSERT(stream); + BT_ASSERT_DBG(stream); if (!field) { /* No discarded events count field found. Not an error, skip. */ @@ -495,7 +478,7 @@ static void update_clock_value(uint64_t *val, uint64_t new_val, unsigned int new_val_size) { - const uint64_t pow2 = 1ULL << new_val_size; + const uint64_t pow2 = new_val_size == 64 ? 0 : 1ULL << new_val_size; const uint64_t mask = pow2 - 1; uint64_t val_masked; @@ -550,7 +533,7 @@ int visit_field_update_clock_value(struct bt_ctf_field *field, uint64_t *val) bt_ctf_object_put_ref(cc); val_size = bt_ctf_field_type_integer_get_size( (void *) field_common->type); - BT_ASSERT(val_size >= 1); + BT_ASSERT_DBG(val_size >= 1); if (bt_ctf_field_type_integer_is_signed( (void *) field_common->type)) { @@ -575,7 +558,7 @@ int visit_field_update_clock_value(struct bt_ctf_field *field, uint64_t *val) struct bt_ctf_field *int_field = bt_ctf_field_enumeration_get_container(field); - BT_ASSERT(int_field); + BT_ASSERT_DBG(int_field); ret = visit_field_update_clock_value(int_field, val); bt_ctf_object_put_ref(int_field); break; @@ -586,13 +569,13 @@ int visit_field_update_clock_value(struct bt_ctf_field *field, uint64_t *val) int64_t len = bt_ctf_field_type_array_get_length( (void *) field_common->type); - BT_ASSERT(len >= 0); + BT_ASSERT_DBG(len >= 0); for (i = 0; i < len; i++) { struct bt_ctf_field *elem_field = bt_ctf_field_array_get_field(field, i); - BT_ASSERT(elem_field); + BT_ASSERT_DBG(elem_field); ret = visit_field_update_clock_value(elem_field, val); bt_ctf_object_put_ref(elem_field); if (ret) { @@ -616,7 +599,7 @@ int visit_field_update_clock_value(struct bt_ctf_field *field, uint64_t *val) struct bt_ctf_field *elem_field = bt_ctf_field_sequence_get_field(field, i); - BT_ASSERT(elem_field); + BT_ASSERT_DBG(elem_field); ret = visit_field_update_clock_value(elem_field, val); bt_ctf_object_put_ref(elem_field); if (ret) { @@ -631,13 +614,13 @@ int visit_field_update_clock_value(struct bt_ctf_field *field, uint64_t *val) int64_t len = bt_ctf_field_type_structure_get_field_count( (void *) field_common->type); - BT_ASSERT(len >= 0); + BT_ASSERT_DBG(len >= 0); for (i = 0; i < len; i++) { struct bt_ctf_field *member_field = bt_ctf_field_structure_get_field_by_index(field, i); - BT_ASSERT(member_field); + BT_ASSERT_DBG(member_field); ret = visit_field_update_clock_value(member_field, val); bt_ctf_object_put_ref(member_field); if (ret) { @@ -668,6 +651,7 @@ end: return ret; } +static int visit_event_update_clock_value(struct bt_ctf_event *event, uint64_t *val) { int ret = 0; @@ -732,7 +716,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) if (ts_begin_field && bt_ctf_field_is_set_recursive(ts_begin_field)) { /* Use provided `timestamp_begin` value as starting value */ ret = bt_ctf_field_integer_unsigned_get_value(ts_begin_field, &val); - BT_ASSERT(ret == 0); + BT_ASSERT_DBG(ret == 0); init_clock_value = val; } else if (stream->last_ts_end != -1ULL) { /* Use last packet's ending timestamp as starting value */ @@ -768,7 +752,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) */ len = bt_ctf_field_type_structure_get_field_count( (void *) packet_context->type); - BT_ASSERT(len >= 0); + BT_ASSERT_DBG(len >= 0); for (i = 0; i < len; i++) { const char *member_name; @@ -776,7 +760,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) ret = bt_ctf_field_type_structure_get_field_by_index( (void *) packet_context->type, &member_name, NULL, i); - BT_ASSERT(ret == 0); + BT_ASSERT_DBG(ret == 0); if (strcmp(member_name, "timestamp_begin") == 0 || strcmp(member_name, "timestamp_end") == 0) { @@ -785,7 +769,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) member_field = bt_ctf_field_structure_get_field_by_index( stream->packet_context, i); - BT_ASSERT(member_field); + BT_ASSERT_DBG(member_field); if (strcmp(member_name, "packet_size") == 0 && !bt_ctf_field_is_set_recursive(member_field)) { @@ -828,7 +812,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) for (i = 0; i < stream->events->len; i++) { struct bt_ctf_event *event = g_ptr_array_index(stream->events, i); - BT_ASSERT(event); + BT_ASSERT_DBG(event); ret = visit_event_update_clock_value(event, &cur_clock_value); if (ret) { BT_LOGW("Cannot automatically update clock value " @@ -853,7 +837,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) */ if (ts_end_field && bt_ctf_field_is_set_recursive(ts_end_field)) { ret = bt_ctf_field_integer_unsigned_get_value(ts_end_field, &val); - BT_ASSERT(ret == 0); + BT_ASSERT_DBG(ret == 0); if (val < cur_clock_value) { BT_LOGW("Packet's final timestamp is less than " @@ -872,7 +856,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) if (ts_end_field && !bt_ctf_field_is_set_recursive(ts_end_field)) { ret = set_integer_field_value(ts_end_field, cur_clock_value); - BT_ASSERT(ret == 0); + BT_ASSERT_DBG(ret == 0); stream->last_ts_end = cur_clock_value; } @@ -883,7 +867,7 @@ int set_packet_context_timestamps(struct bt_ctf_stream *stream) /* Set `timestamp_begin` field to initial clock value */ if (ts_begin_field && !bt_ctf_field_is_set_recursive(ts_begin_field)) { ret = set_integer_field_value(ts_begin_field, init_clock_value); - BT_ASSERT(ret == 0); + BT_ASSERT_DBG(ret == 0); } end: @@ -979,7 +963,7 @@ int create_stream_file(struct bt_ctf_writer *writer, /* Use stream name's base name as prefix */ gchar *basename = g_path_get_basename(stream->common.name->str); - BT_ASSERT(basename); + BT_ASSERT_DBG(basename); if (strcmp(basename, G_DIR_SEPARATOR_S) == 0) { g_string_assign(filename, "stream"); @@ -998,7 +982,7 @@ int create_stream_file(struct bt_ctf_writer *writer, g_path_get_basename( stream->common.stream_class->name->str); - BT_ASSERT(basename); + BT_ASSERT_DBG(basename); if (strcmp(basename, G_DIR_SEPARATOR_S) == 0) { g_string_assign(filename, "stream"); @@ -1015,13 +999,13 @@ int create_stream_file(struct bt_ctf_writer *writer, append_ids: stream_class_id = bt_ctf_stream_class_common_get_id(stream->common.stream_class); - BT_ASSERT(stream_class_id >= 0); - BT_ASSERT(stream->common.id >= 0); + BT_ASSERT_DBG(stream_class_id >= 0); + BT_ASSERT_DBG(stream->common.id >= 0); g_string_append_printf(filename, "-%" PRId64 "-%" PRId64, stream_class_id, stream->common.id); file_path = g_build_filename(writer->path->str, filename->str, NULL); - if (file_path == NULL) { + if (!file_path) { ret = -1; goto end; } @@ -1044,7 +1028,6 @@ end: return ret; } -BT_HIDDEN struct bt_ctf_stream *bt_ctf_stream_create_with_id( struct bt_ctf_stream_class *stream_class, const char *name, uint64_t id) @@ -1093,7 +1076,7 @@ struct bt_ctf_stream *bt_ctf_stream_create_with_id( stream->last_ts_end = -1ULL; BT_LOGD("CTF writer stream object belongs writer's trace: " "writer-addr=%p", writer); - BT_ASSERT(writer); + BT_ASSERT_DBG(writer); if (stream_class->common.packet_context_field_type) { BT_LOGD("Creating stream's packet context field: " @@ -1175,6 +1158,7 @@ end: return stream; } +BT_EXPORT struct bt_ctf_stream *bt_ctf_stream_create( struct bt_ctf_stream_class *stream_class, const char *name, uint64_t id_param) @@ -1183,6 +1167,7 @@ struct bt_ctf_stream *bt_ctf_stream_create( name, id_param); } +BT_EXPORT int bt_ctf_stream_get_discarded_events_count( struct bt_ctf_stream *stream, uint64_t *count) { @@ -1237,6 +1222,7 @@ end: return ret; } +BT_EXPORT void bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count) { @@ -1299,7 +1285,7 @@ static int auto_populate_event_header(struct bt_ctf_stream *stream, BT_CTF_TO_COMMON(stream))); int64_t event_class_id; - BT_ASSERT(event); + BT_ASSERT_DBG(event); if (!event->common.header_field) { goto end; @@ -1318,7 +1304,7 @@ static int auto_populate_event_header(struct bt_ctf_stream *stream, id_field = bt_ctf_field_structure_get_field_by_name( (void *) event->common.header_field->field, "id"); event_class_id = bt_ctf_event_class_common_get_id(event->common.class); - BT_ASSERT(event_class_id >= 0); + BT_ASSERT_DBG(event_class_id >= 0); if (id_field && bt_ctf_field_get_type_id(id_field) == BT_CTF_FIELD_TYPE_ID_INTEGER) { ret = set_integer_field_value(id_field, event_class_id); @@ -1350,12 +1336,12 @@ static int auto_populate_event_header(struct bt_ctf_stream *stream, if (mapped_clock_class) { uint64_t timestamp; - BT_ASSERT(mapped_clock_class == + BT_ASSERT_DBG(mapped_clock_class == stream_class->clock->clock_class); ret = bt_ctf_clock_get_value( stream_class->clock, ×tamp); - BT_ASSERT(ret == 0); + BT_ASSERT_DBG(ret == 0); ret = set_integer_field_value(timestamp_field, timestamp); if (ret) { @@ -1378,6 +1364,7 @@ end: return ret; } +BT_EXPORT int bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event) { @@ -1464,6 +1451,7 @@ error: return ret; } +BT_EXPORT struct bt_ctf_field *bt_ctf_stream_get_packet_context(struct bt_ctf_stream *stream) { struct bt_ctf_field *packet_context = NULL; @@ -1481,6 +1469,7 @@ end: return packet_context; } +BT_EXPORT int bt_ctf_stream_set_packet_context(struct bt_ctf_stream *stream, struct bt_ctf_field *field) { @@ -1517,6 +1506,7 @@ end: return ret; } +BT_EXPORT struct bt_ctf_field *bt_ctf_stream_get_packet_header(struct bt_ctf_stream *stream) { struct bt_ctf_field *packet_header = NULL; @@ -1534,6 +1524,7 @@ end: return packet_header; } +BT_EXPORT int bt_ctf_stream_set_packet_header(struct bt_ctf_stream *stream, struct bt_ctf_field *field) { @@ -1566,7 +1557,7 @@ int bt_ctf_stream_set_packet_header(struct bt_ctf_stream *stream, } field_type = bt_ctf_field_get_type(field); - BT_ASSERT(field_type); + BT_ASSERT_DBG(field_type); if (bt_ctf_field_type_common_compare((void *) field_type, trace->common.packet_header_field_type)) { @@ -1605,6 +1596,7 @@ void reset_structure_field(struct bt_ctf_field *structure, const char *name) } } +BT_EXPORT int bt_ctf_stream_flush(struct bt_ctf_stream *stream) { int ret = 0; @@ -1627,7 +1619,7 @@ int bt_ctf_stream_flush(struct bt_ctf_stream *stream) packet_size_field = bt_ctf_field_structure_get_field_by_name( stream->packet_context, "packet_size"); - has_packet_size = (packet_size_field != NULL); + has_packet_size = packet_size_field; bt_ctf_object_put_ref(packet_size_field); } @@ -1650,7 +1642,7 @@ int bt_ctf_stream_flush(struct bt_ctf_stream *stream) bt_ctf_stream_get_name(stream), stream->flushed_packet_count); trace = BT_CTF_FROM_COMMON(bt_ctf_stream_class_common_borrow_trace( stream->common.stream_class)); - BT_ASSERT(trace); + BT_ASSERT_DBG(trace); native_byte_order = bt_ctf_trace_get_native_byte_order(trace); ret = auto_populate_packet_header(stream); @@ -1871,15 +1863,15 @@ void bt_ctf_stream_destroy(struct bt_ctf_object *obj) } static -int _set_structure_field_integer(struct bt_ctf_field *structure, char *name, +int _set_structure_field_integer(struct bt_ctf_field *structure, const char *name, uint64_t value, bt_ctf_bool force) { int ret = 0; struct bt_ctf_field_type *field_type = NULL; struct bt_ctf_field *integer; - BT_ASSERT(structure); - BT_ASSERT(name); + BT_ASSERT_DBG(structure); + BT_ASSERT_DBG(name); integer = bt_ctf_field_structure_get_field_by_name(structure, name); if (!integer) { @@ -1898,7 +1890,7 @@ int _set_structure_field_integer(struct bt_ctf_field *structure, char *name, } field_type = bt_ctf_field_get_type(integer); - BT_ASSERT(field_type); + BT_ASSERT_DBG(field_type); if (bt_ctf_field_type_get_type_id(field_type) != BT_CTF_FIELD_TYPE_ID_INTEGER) { /* * The user most likely meant for us to populate this field @@ -1934,23 +1926,26 @@ end: * <0 if an error was encoutered */ static -int try_set_structure_field_integer(struct bt_ctf_field *structure, char *name, +int try_set_structure_field_integer(struct bt_ctf_field *structure, const char *name, uint64_t value) { return _set_structure_field_integer(structure, name, value, BT_CTF_FALSE); } +BT_EXPORT struct bt_ctf_stream_class *bt_ctf_stream_get_class( struct bt_ctf_stream *stream) { return bt_ctf_object_get_ref(bt_ctf_stream_common_borrow_class(BT_CTF_TO_COMMON(stream))); } +BT_EXPORT const char *bt_ctf_stream_get_name(struct bt_ctf_stream *stream) { return bt_ctf_stream_common_get_name(BT_CTF_TO_COMMON(stream)); } +BT_EXPORT int64_t bt_ctf_stream_get_id(struct bt_ctf_stream *stream) { return bt_ctf_stream_common_get_id(BT_CTF_TO_COMMON(stream));