X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Futils%2Ftrimmer%2Ftrimmer.c;h=914022049976ee5f714e8bdd50c5e3a49124dfae;hb=d24d56638469189904fb6ddbb3c725817b3e9417;hp=b8cc481a5b79fb34112b7a5023e1ecec9ef48b55;hpb=91d8147391efdc4d42cc4e1c171a65c0372a008f;p=babeltrace.git diff --git a/src/plugins/utils/trimmer/trimmer.c b/src/plugins/utils/trimmer/trimmer.c index b8cc481a..91402204 100644 --- a/src/plugins/utils/trimmer/trimmer.c +++ b/src/plugins/utils/trimmer/trimmer.c @@ -21,14 +21,15 @@ * SOFTWARE. */ -#define BT_LOG_TAG "PLUGIN-UTILS-TRIMMER-FLT" -#include "logging.h" +#define BT_COMP_LOG_SELF_COMP (trimmer_comp->self_comp) +#define BT_LOG_OUTPUT_LEVEL (trimmer_comp->log_level) +#define BT_LOG_TAG "PLUGIN/FLT.UTILS.TRIMMER" +#include "plugins/comp-logging.h" #include "compat/utc.h" #include "compat/time.h" #include #include "common/common.h" -#include "plugins/plugins-common.h" #include "common/assert.h" #include #include @@ -71,6 +72,8 @@ struct trimmer_bound { struct trimmer_comp { struct trimmer_bound begin, end; bool is_gmt; + bt_logging_level log_level; + bt_self_component *self_comp; }; enum trimmer_iterator_state { @@ -127,12 +130,6 @@ struct trimmer_iterator { }; struct trimmer_iterator_stream_state { - /* - * True if both stream beginning and initial stream activity - * beginning messages were pushed for this stream. - */ - bool inited; - /* * True if the last pushed message for this stream was a stream * activity end message. @@ -150,9 +147,6 @@ struct trimmer_iterator_stream_state { /* Owned by this (`NULL` initially and between packets) */ const bt_packet *cur_packet; - - /* Owned by this */ - const bt_message *stream_beginning_msg; }; static @@ -239,8 +233,8 @@ end: * TODO: Check overflows. */ static -int set_bound_from_str(const char *str, struct trimmer_bound *bound, - bool is_gmt) +int set_bound_from_str(struct trimmer_comp *trimmer_comp, + const char *str, struct trimmer_bound *bound, bool is_gmt) { int ret = 0; int s_ret; @@ -337,7 +331,7 @@ int set_bound_from_str(const char *str, struct trimmer_bound *bound, goto end; } - BT_LOGE("Invalid date/time format: param=\"%s\"", str); + BT_COMP_LOGE("Invalid date/time format: param=\"%s\"", str); ret = -1; end: @@ -351,7 +345,8 @@ end: * Returns a negative value if anything goes wrong. */ static -int set_bound_from_param(const char *param_name, const bt_value *param, +int set_bound_from_param(struct trimmer_comp *trimmer_comp, + const char *param_name, const bt_value *param, struct trimmer_bound *bound, bool is_gmt) { int ret; @@ -370,21 +365,21 @@ int set_bound_from_param(const char *param_name, const bt_value *param, } else if (bt_value_is_string(param)) { arg = bt_value_string_get(param); } else { - BT_LOGE("`%s` parameter must be an integer or a string value.", + BT_COMP_LOGE("`%s` parameter must be an integer or a string value.", param_name); ret = -1; goto end; } - ret = set_bound_from_str(arg, bound, is_gmt); + ret = set_bound_from_str(trimmer_comp, arg, bound, is_gmt); end: return ret; } static -int validate_trimmer_bounds(struct trimmer_bound *begin, - struct trimmer_bound *end) +int validate_trimmer_bounds(struct trimmer_comp *trimmer_comp, + struct trimmer_bound *begin, struct trimmer_bound *end) { int ret = 0; @@ -393,7 +388,7 @@ int validate_trimmer_bounds(struct trimmer_bound *begin, if (!begin->is_infinite && !end->is_infinite && begin->ns_from_origin > end->ns_from_origin) { - BT_LOGE("Trimming time range's beginning time is greater than end time: " + BT_COMP_LOGE("Trimming time range's beginning time is greater than end time: " "begin-ns-from-origin=%" PRId64 ", " "end-ns-from-origin=%" PRId64, begin->ns_from_origin, @@ -403,7 +398,7 @@ int validate_trimmer_bounds(struct trimmer_bound *begin, } if (!begin->is_infinite && begin->ns_from_origin == INT64_MIN) { - BT_LOGE("Invalid trimming time range's beginning time: " + BT_COMP_LOGE("Invalid trimming time range's beginning time: " "ns-from-origin=%" PRId64, begin->ns_from_origin); ret = -1; @@ -411,7 +406,7 @@ int validate_trimmer_bounds(struct trimmer_bound *begin, } if (!end->is_infinite && end->ns_from_origin == INT64_MIN) { - BT_LOGE("Invalid trimming time range's end time: " + BT_COMP_LOGE("Invalid trimming time range's end time: " "ns-from-origin=%" PRId64, end->ns_from_origin); ret = -1; @@ -437,10 +432,10 @@ int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, value = bt_value_map_borrow_entry_value_const(params, "begin"); if (value) { - if (set_bound_from_param("begin", value, + if (set_bound_from_param(trimmer_comp, "begin", value, &trimmer_comp->begin, trimmer_comp->is_gmt)) { /* set_bound_from_param() logs errors */ - ret = BT_SELF_COMPONENT_STATUS_ERROR; + ret = -1; goto end; } } else { @@ -450,10 +445,10 @@ int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, value = bt_value_map_borrow_entry_value_const(params, "end"); if (value) { - if (set_bound_from_param("end", value, + if (set_bound_from_param(trimmer_comp, "end", value, &trimmer_comp->end, trimmer_comp->is_gmt)) { /* set_bound_from_param() logs errors */ - ret = BT_SELF_COMPONENT_STATUS_ERROR; + ret = -1; goto end; } } else { @@ -464,51 +459,70 @@ int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, end: if (trimmer_comp->begin.is_set && trimmer_comp->end.is_set) { /* validate_trimmer_bounds() logs errors */ - ret = validate_trimmer_bounds(&trimmer_comp->begin, - &trimmer_comp->end); + ret = validate_trimmer_bounds(trimmer_comp, + &trimmer_comp->begin, &trimmer_comp->end); } return ret; } -bt_self_component_status trimmer_init(bt_self_component_filter *self_comp, +bt_component_class_init_method_status trimmer_init( + bt_self_component_filter *self_comp_flt, const bt_value *params, void *init_data) { int ret; - bt_self_component_status status; + bt_component_class_init_method_status status = + BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK; + bt_self_component_add_port_status add_port_status; struct trimmer_comp *trimmer_comp = create_trimmer_comp(); - + bt_self_component *self_comp = + bt_self_component_filter_as_self_component(self_comp_flt); if (!trimmer_comp) { - status = BT_SELF_COMPONENT_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; goto error; } - status = bt_self_component_filter_add_input_port( - self_comp, in_port_name, NULL, NULL); - if (status != BT_SELF_COMPONENT_STATUS_OK) { + trimmer_comp->log_level = bt_component_get_logging_level( + bt_self_component_as_component(self_comp)); + trimmer_comp->self_comp = self_comp; + add_port_status = bt_self_component_filter_add_input_port( + self_comp_flt, in_port_name, NULL, NULL); + switch (add_port_status) { + case BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR: + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; + goto error; + case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; goto error; + default: + break; } - status = bt_self_component_filter_add_output_port( - self_comp, "out", NULL, NULL); - if (status != BT_SELF_COMPONENT_STATUS_OK) { + add_port_status = bt_self_component_filter_add_output_port( + self_comp_flt, "out", NULL, NULL); + switch (add_port_status) { + case BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR: + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; goto error; + case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + goto error; + default: + break; } ret = init_trimmer_comp_from_params(trimmer_comp, params); if (ret) { - status = BT_SELF_COMPONENT_STATUS_ERROR; + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; goto error; } - bt_self_component_set_data( - bt_self_component_filter_as_self_component(self_comp), - trimmer_comp); + bt_self_component_set_data(self_comp, trimmer_comp); goto end; error: - if (status == BT_SELF_COMPONENT_STATUS_OK) { - status = BT_SELF_COMPONENT_STATUS_ERROR; + if (status == BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK) { + status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; } if (trimmer_comp) { @@ -543,23 +557,22 @@ void destroy_trimmer_iterator_stream_state( { BT_ASSERT(sstate); BT_PACKET_PUT_REF_AND_RESET(sstate->cur_packet); - BT_MESSAGE_PUT_REF_AND_RESET(sstate->stream_beginning_msg); g_free(sstate); } BT_HIDDEN -bt_self_message_iterator_status trimmer_msg_iter_init( +bt_component_class_message_iterator_init_method_status trimmer_msg_iter_init( bt_self_message_iterator *self_msg_iter, bt_self_component_filter *self_comp, bt_self_component_port_output *port) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_init_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_OK; struct trimmer_iterator *trimmer_it; trimmer_it = g_new0(struct trimmer_iterator, 1); if (!trimmer_it) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -585,13 +598,13 @@ bt_self_message_iterator_status trimmer_msg_iter_init( bt_self_component_filter_borrow_input_port_by_name( self_comp, in_port_name)); if (!trimmer_it->upstream_iter) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_ERROR; goto end; } trimmer_it->output_messages = g_queue_new(); if (!trimmer_it->output_messages) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -599,7 +612,7 @@ bt_self_message_iterator_status trimmer_msg_iter_init( g_direct_equal, NULL, (GDestroyNotify) destroy_trimmer_iterator_stream_state); if (!trimmer_it->stream_states) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -607,7 +620,7 @@ bt_self_message_iterator_status trimmer_msg_iter_init( bt_self_message_iterator_set_data(self_msg_iter, trimmer_it); end: - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK && trimmer_it) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_OK && trimmer_it) { destroy_trimmer_iterator(trimmer_it); } @@ -761,9 +774,11 @@ void put_messages(bt_message_array_const msgs, uint64_t count) } static inline -int set_trimmer_iterator_bound(struct trimmer_bound *bound, - int64_t ns_from_origin, bool is_gmt) +int set_trimmer_iterator_bound(struct trimmer_iterator *trimmer_it, + struct trimmer_bound *bound, int64_t ns_from_origin, + bool is_gmt) { + struct trimmer_comp *trimmer_comp = trimmer_it->trimmer_comp; struct tm tm; time_t time_seconds = (time_t) (ns_from_origin / NS_PER_S); int ret = 0; @@ -779,7 +794,7 @@ int set_trimmer_iterator_bound(struct trimmer_bound *bound, } if (errno) { - BT_LOGE_ERRNO("Cannot convert timestamp to date and time", + BT_COMP_LOGE_ERRNO("Cannot convert timestamp to date and time", "ts=%" PRId64, (int64_t) time_seconds); ret = -1; goto end; @@ -794,11 +809,12 @@ end: } static -bt_self_message_iterator_status state_set_trimmer_iterator_bounds( +bt_component_class_message_iterator_next_method_status +state_set_trimmer_iterator_bounds( struct trimmer_iterator *trimmer_it) { - bt_message_iterator_status upstream_iter_status = - BT_MESSAGE_ITERATOR_STATUS_OK; + bt_message_iterator_next_status upstream_iter_status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; struct trimmer_comp *trimmer_comp = trimmer_it->trimmer_comp; bt_message_array_const msgs; uint64_t count = 0; @@ -813,7 +829,7 @@ bt_self_message_iterator_status state_set_trimmer_iterator_bounds( upstream_iter_status = bt_self_component_port_input_message_iterator_next( trimmer_it->upstream_iter, &msgs, &count); - if (upstream_iter_status != BT_MESSAGE_ITERATOR_STATUS_OK) { + if (upstream_iter_status != BT_MESSAGE_ITERATOR_NEXT_STATUS_OK) { goto end; } @@ -844,7 +860,7 @@ bt_self_message_iterator_status state_set_trimmer_iterator_bounds( found: if (!trimmer_it->begin.is_set) { BT_ASSERT(!trimmer_it->begin.is_infinite); - ret = set_trimmer_iterator_bound(&trimmer_it->begin, + ret = set_trimmer_iterator_bound(trimmer_it, &trimmer_it->begin, ns_from_origin, trimmer_comp->is_gmt); if (ret) { goto error; @@ -853,15 +869,15 @@ found: if (!trimmer_it->end.is_set) { BT_ASSERT(!trimmer_it->end.is_infinite); - ret = set_trimmer_iterator_bound(&trimmer_it->end, + ret = set_trimmer_iterator_bound(trimmer_it, &trimmer_it->end, ns_from_origin, trimmer_comp->is_gmt); if (ret) { goto error; } } - ret = validate_trimmer_bounds(&trimmer_it->begin, - &trimmer_it->end); + ret = validate_trimmer_bounds(trimmer_it->trimmer_comp, + &trimmer_it->begin, &trimmer_it->end); if (ret) { goto error; } @@ -870,26 +886,28 @@ found: error: put_messages(msgs, count); - upstream_iter_status = BT_MESSAGE_ITERATOR_STATUS_ERROR; + upstream_iter_status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; end: return (int) upstream_iter_status; } static -bt_self_message_iterator_status state_seek_initially( +bt_component_class_message_iterator_next_method_status state_seek_initially( struct trimmer_iterator *trimmer_it) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + struct trimmer_comp *trimmer_comp = trimmer_it->trimmer_comp; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; BT_ASSERT(trimmer_it->begin.is_set); if (trimmer_it->begin.is_infinite) { if (!bt_self_component_port_input_message_iterator_can_seek_beginning( trimmer_it->upstream_iter)) { - BT_LOGE_STR("Cannot make upstream message iterator initially seek its beginning."); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + BT_COMP_LOGE_STR("Cannot make upstream message iterator initially seek its beginning."); + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -899,10 +917,10 @@ bt_self_message_iterator_status state_seek_initially( if (!bt_self_component_port_input_message_iterator_can_seek_ns_from_origin( trimmer_it->upstream_iter, trimmer_it->begin.ns_from_origin)) { - BT_LOGE("Cannot make upstream message iterator initially seek: " + BT_COMP_LOGE("Cannot make upstream message iterator initially seek: " "seek-ns-from-origin=%" PRId64, trimmer_it->begin.ns_from_origin); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -910,7 +928,7 @@ bt_self_message_iterator_status state_seek_initially( trimmer_it->upstream_iter, trimmer_it->begin.ns_from_origin); } - if (status == BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status == BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { trimmer_it->state = TRIMMER_ITERATOR_STATE_TRIM; } @@ -946,11 +964,12 @@ int clock_raw_value_from_ns_from_origin(const bt_clock_class *clock_class, } static inline -bt_self_message_iterator_status end_stream(struct trimmer_iterator *trimmer_it, +bt_component_class_message_iterator_next_method_status +end_stream(struct trimmer_iterator *trimmer_it, struct trimmer_iterator_stream_state *sstate) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; uint64_t raw_value; const bt_clock_class *clock_class; int ret; @@ -979,7 +998,7 @@ bt_self_message_iterator_status end_stream(struct trimmer_iterator *trimmer_it, ret = clock_raw_value_from_ns_from_origin(clock_class, trimmer_it->end.ns_from_origin, &raw_value); if (ret) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -987,7 +1006,7 @@ bt_self_message_iterator_status end_stream(struct trimmer_iterator *trimmer_it, trimmer_it->self_msg_iter, sstate->cur_packet, raw_value); if (!msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -1010,7 +1029,7 @@ bt_self_message_iterator_status end_stream(struct trimmer_iterator *trimmer_it, msg = bt_message_stream_activity_end_create( trimmer_it->self_msg_iter, sstate->stream); if (!msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -1033,7 +1052,7 @@ bt_self_message_iterator_status end_stream(struct trimmer_iterator *trimmer_it, ret = clock_raw_value_from_ns_from_origin(clock_class, sstate->stream_act_end_ns_from_origin, &raw_value); if (ret) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -1047,7 +1066,7 @@ bt_self_message_iterator_status end_stream(struct trimmer_iterator *trimmer_it, msg = bt_message_stream_end_create(trimmer_it->self_msg_iter, sstate->stream); if (!msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -1066,11 +1085,11 @@ end: } static inline -bt_self_message_iterator_status end_iterator_streams( +bt_component_class_message_iterator_next_method_status end_iterator_streams( struct trimmer_iterator *trimmer_it) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; GHashTableIter iter; gpointer key, sstate; @@ -1104,14 +1123,15 @@ end: } static inline -bt_self_message_iterator_status create_stream_beginning_activity_message( +bt_component_class_message_iterator_next_method_status +create_stream_beginning_activity_message( struct trimmer_iterator *trimmer_it, const bt_stream *stream, const bt_clock_class *clock_class, bt_message **msg) { bt_message *local_msg; - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; BT_ASSERT(msg); BT_ASSERT(!trimmer_it->begin.is_infinite); @@ -1119,7 +1139,7 @@ bt_self_message_iterator_status create_stream_beginning_activity_message( local_msg = bt_message_stream_activity_beginning_create( trimmer_it->self_msg_iter, stream); if (!local_msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -1130,7 +1150,7 @@ bt_self_message_iterator_status create_stream_beginning_activity_message( ret = clock_raw_value_from_ns_from_origin(clock_class, trimmer_it->begin.ns_from_origin, &raw_value); if (ret) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; bt_message_put_ref(local_msg); goto end; } @@ -1145,150 +1165,6 @@ end: return status; } -/* - * Makes sure to initialize a stream state, pushing the appropriate - * initial messages. - * - * `stream_act_beginning_msg` is an initial stream activity beginning - * message to potentially use, depending on its clock snapshot state. - * This function consumes `stream_act_beginning_msg` unconditionally. - */ -static inline -bt_self_message_iterator_status ensure_stream_state_is_inited( - struct trimmer_iterator *trimmer_it, - struct trimmer_iterator_stream_state *sstate, - const bt_message *stream_act_beginning_msg) -{ - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; - bt_message *new_msg = NULL; - const bt_clock_class *clock_class = - bt_stream_class_borrow_default_clock_class_const( - bt_stream_borrow_class_const(sstate->stream)); - - BT_ASSERT(!sstate->inited); - - if (!sstate->stream_beginning_msg) { - /* No initial stream beginning message: create one */ - sstate->stream_beginning_msg = - bt_message_stream_beginning_create( - trimmer_it->self_msg_iter, sstate->stream); - if (!sstate->stream_beginning_msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; - goto end; - } - } - - /* Push initial stream beginning message */ - BT_ASSERT(sstate->stream_beginning_msg); - push_message(trimmer_it, sstate->stream_beginning_msg); - sstate->stream_beginning_msg = NULL; - - if (stream_act_beginning_msg) { - /* - * Initial stream activity beginning message exists: if - * its time is -inf, then create and push a new one - * having the trimming range's beginning time. Otherwise - * push it as is (known and unknown). - */ - const bt_clock_snapshot *cs; - bt_message_stream_activity_clock_snapshot_state sa_cs_state; - - sa_cs_state = bt_message_stream_activity_beginning_borrow_default_clock_snapshot_const( - stream_act_beginning_msg, &cs); - if (sa_cs_state == BT_MESSAGE_STREAM_ACTIVITY_CLOCK_SNAPSHOT_STATE_INFINITE && - !trimmer_it->begin.is_infinite) { - /* - * -inf time: use trimming range's beginning - * time (which is not -inf). - */ - status = create_stream_beginning_activity_message( - trimmer_it, sstate->stream, clock_class, - &new_msg); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - - push_message(trimmer_it, new_msg); - new_msg = NULL; - } else { - /* Known/unknown: push as is */ - push_message(trimmer_it, stream_act_beginning_msg); - stream_act_beginning_msg = NULL; - } - } else { - BT_ASSERT(!trimmer_it->begin.is_infinite); - - /* - * No stream beginning activity message: create and push - * a new message. - */ - status = create_stream_beginning_activity_message( - trimmer_it, sstate->stream, clock_class, &new_msg); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - - push_message(trimmer_it, new_msg); - new_msg = NULL; - } - - sstate->inited = true; - -end: - bt_message_put_ref(new_msg); - bt_message_put_ref(stream_act_beginning_msg); - return status; -} - -static inline -bt_self_message_iterator_status ensure_cur_packet_exists( - struct trimmer_iterator *trimmer_it, - struct trimmer_iterator_stream_state *sstate, - const bt_packet *packet) -{ - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; - int ret; - const bt_clock_class *clock_class = - bt_stream_class_borrow_default_clock_class_const( - bt_stream_borrow_class_const(sstate->stream)); - bt_message *msg = NULL; - uint64_t raw_value; - - BT_ASSERT(!trimmer_it->begin.is_infinite); - BT_ASSERT(!sstate->cur_packet); - - /* - * Create and push an initial packet beginning message, - * making its time the trimming range's beginning time. - */ - ret = clock_raw_value_from_ns_from_origin(clock_class, - trimmer_it->begin.ns_from_origin, &raw_value); - if (ret) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; - goto end; - } - - msg = bt_message_packet_beginning_create_with_default_clock_snapshot( - trimmer_it->self_msg_iter, packet, raw_value); - if (!msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; - goto end; - } - - push_message(trimmer_it, msg); - msg = NULL; - - /* Set packet as this stream's current packet */ - sstate->cur_packet = packet; - bt_packet_get_ref(sstate->cur_packet); - -end: - bt_message_put_ref(msg); - return status; -} - /* * Handles a message which is associated to a given stream state. This * _could_ make the iterator's output message queue grow; this could @@ -1306,13 +1182,14 @@ end: * `reached_end`. */ static inline -bt_self_message_iterator_status handle_message_with_stream_state( +bt_component_class_message_iterator_next_method_status +handle_message_with_stream_state( struct trimmer_iterator *trimmer_it, const bt_message *msg, struct trimmer_iterator_stream_state *sstate, int64_t ns_from_origin, bool *reached_end) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; bt_message_type msg_type = bt_message_get_type(msg); int ret; @@ -1325,27 +1202,6 @@ bt_self_message_iterator_status handle_message_with_stream_state( break; } - if (G_UNLIKELY(!sstate->inited)) { - status = ensure_stream_state_is_inited(trimmer_it, - sstate, NULL); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } - - if (G_UNLIKELY(!sstate->cur_packet)) { - const bt_event *event = - bt_message_event_borrow_event_const(msg); - const bt_packet *packet = bt_event_borrow_packet_const( - event); - - status = ensure_cur_packet_exists(trimmer_it, sstate, - packet); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } - BT_ASSERT(sstate->cur_packet); push_message(trimmer_it, msg); msg = NULL; @@ -1358,14 +1214,6 @@ bt_self_message_iterator_status handle_message_with_stream_state( break; } - if (G_UNLIKELY(!sstate->inited)) { - status = ensure_stream_state_is_inited(trimmer_it, - sstate, NULL); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } - BT_ASSERT(!sstate->cur_packet); sstate->cur_packet = bt_message_packet_beginning_borrow_packet_const(msg); @@ -1383,25 +1231,6 @@ bt_self_message_iterator_status handle_message_with_stream_state( break; } - if (G_UNLIKELY(!sstate->inited)) { - status = ensure_stream_state_is_inited(trimmer_it, - sstate, NULL); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } - - if (G_UNLIKELY(!sstate->cur_packet)) { - const bt_packet *packet = - bt_message_packet_end_borrow_packet_const(msg); - - status = ensure_cur_packet_exists(trimmer_it, sstate, - packet); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } - BT_ASSERT(sstate->cur_packet); BT_PACKET_PUT_REF_AND_RESET(sstate->cur_packet); push_message(trimmer_it, msg); @@ -1438,7 +1267,7 @@ bt_self_message_iterator_status handle_message_with_stream_state( if (bt_clock_snapshot_get_ns_from_origin(end_cs, &end_ns_from_origin)) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -1470,7 +1299,7 @@ bt_self_message_iterator_status handle_message_with_stream_state( ret = clock_raw_value_from_ns_from_origin(clock_class, trimmer_it->end.ns_from_origin, &end_raw_value); if (ret) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -1493,7 +1322,7 @@ bt_self_message_iterator_status handle_message_with_stream_state( } if (!new_msg) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -1501,14 +1330,6 @@ bt_self_message_iterator_status handle_message_with_stream_state( BT_MESSAGE_MOVE_REF(msg, new_msg); } - if (G_UNLIKELY(!sstate->inited)) { - status = ensure_stream_state_is_inited(trimmer_it, - sstate, NULL); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } - push_message(trimmer_it, msg); msg = NULL; break; @@ -1528,18 +1349,8 @@ bt_self_message_iterator_status handle_message_with_stream_state( break; } - if (!sstate->inited) { - status = ensure_stream_state_is_inited(trimmer_it, - sstate, msg); - msg = NULL; - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } - } else { - push_message(trimmer_it, msg); - msg = NULL; - } - + push_message(trimmer_it, msg); + msg = NULL; break; case BT_MESSAGE_TYPE_STREAM_ACTIVITY_END: if (trimmer_it->end.is_infinite) { @@ -1549,12 +1360,10 @@ bt_self_message_iterator_status handle_message_with_stream_state( } if (ns_from_origin == INT64_MIN) { - /* Unknown: push as is if stream state is inited */ - if (sstate->inited) { - push_message(trimmer_it, msg); - msg = NULL; - sstate->last_msg_is_stream_activity_end = true; - } + /* Unknown: consider it to be in the trimmer window. */ + push_message(trimmer_it, msg); + msg = NULL; + sstate->last_msg_is_stream_activity_end = true; } else if (ns_from_origin == INT64_MAX) { /* Infinite: use trimming range's end time */ sstate->stream_act_end_ns_from_origin = @@ -1569,21 +1378,6 @@ bt_self_message_iterator_status handle_message_with_stream_state( break; } - if (!sstate->inited) { - /* - * First message for this stream is a - * stream activity end: we can't deduce - * anything about the stream activity - * beginning's time, and using this - * message's time would make a useless - * pair of stream activity beginning/end - * with the same time. Just skip this - * message and wait for something - * useful. - */ - break; - } - push_message(trimmer_it, msg); msg = NULL; sstate->last_msg_is_stream_activity_end = true; @@ -1592,45 +1386,34 @@ bt_self_message_iterator_status handle_message_with_stream_state( break; case BT_MESSAGE_TYPE_STREAM_BEGINNING: - /* - * We don't know what follows at this point, so just - * keep this message until we know what to do with it - * (it will be used in ensure_stream_state_is_inited()). - */ - BT_ASSERT(!sstate->inited); - BT_MESSAGE_MOVE_REF(sstate->stream_beginning_msg, msg); + push_message(trimmer_it, msg); + msg = NULL; break; case BT_MESSAGE_TYPE_STREAM_END: - if (sstate->inited) { - /* - * This is the end of an inited stream: end this - * stream if its stream activity end message - * time is not the trimming range's end time - * (which means the final stream activity end - * message had an infinite time). end_stream() - * will generate its own stream end message. - */ - if (trimmer_it->end.is_infinite) { - push_message(trimmer_it, msg); - msg = NULL; - g_hash_table_remove(trimmer_it->stream_states, - sstate->stream); - } else if (sstate->stream_act_end_ns_from_origin < - trimmer_it->end.ns_from_origin) { - status = end_stream(trimmer_it, sstate); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { - goto end; - } + /* + * This is the end of a stream: end this + * stream if its stream activity end message + * time is not the trimming range's end time + * (which means the final stream activity end + * message had an infinite time). end_stream() + * will generate its own stream end message. + */ + if (trimmer_it->end.is_infinite) { + push_message(trimmer_it, msg); + msg = NULL; - /* We won't need this stream state again */ - g_hash_table_remove(trimmer_it->stream_states, - sstate->stream); + /* We won't need this stream state again */ + g_hash_table_remove(trimmer_it->stream_states, sstate->stream); + } else if (sstate->stream_act_end_ns_from_origin < + trimmer_it->end.ns_from_origin) { + status = end_stream(trimmer_it, sstate); + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { + goto end; } - } else { - /* We dont't need this stream state anymore */ + + /* We won't need this stream state again */ g_hash_table_remove(trimmer_it->stream_states, sstate->stream); } - break; default: break; @@ -1639,7 +1422,7 @@ bt_self_message_iterator_status handle_message_with_stream_state( end: /* We release the message's reference whatever the outcome */ bt_message_put_ref(msg); - return BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + return BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; } /* @@ -1655,16 +1438,17 @@ end: * `reached_end`. */ static inline -bt_self_message_iterator_status handle_message( +bt_component_class_message_iterator_next_method_status handle_message( struct trimmer_iterator *trimmer_it, const bt_message *msg, bool *reached_end) { - bt_self_message_iterator_status status; + bt_component_class_message_iterator_next_method_status status; const bt_stream *stream = NULL; int64_t ns_from_origin = INT64_MIN; bool skip; int ret; struct trimmer_iterator_stream_state *sstate = NULL; + struct trimmer_comp *trimmer_comp = trimmer_it->trimmer_comp; /* Find message's associated stream */ switch (bt_message_get_type(msg)) { @@ -1722,14 +1506,14 @@ bt_self_message_iterator_status handle_message( */ sc = bt_stream_borrow_class_const(stream); if (!bt_stream_class_borrow_default_clock_class_const(sc)) { - BT_LOGE("Unsupported stream: stream class does " + BT_COMP_LOGE("Unsupported stream: stream class does " "not have a default clock class: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", stream, bt_stream_get_id(stream), bt_stream_get_name(stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -1742,60 +1526,60 @@ bt_self_message_iterator_status handle_message( */ if (!bt_stream_class_packets_have_beginning_default_clock_snapshot( sc)) { - BT_LOGE("Unsupported stream: packets have " + BT_COMP_LOGE("Unsupported stream: packets have " "no beginning clock snapshot: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", stream, bt_stream_get_id(stream), bt_stream_get_name(stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } if (!bt_stream_class_packets_have_end_default_clock_snapshot( sc)) { - BT_LOGE("Unsupported stream: packets have " + BT_COMP_LOGE("Unsupported stream: packets have " "no end clock snapshot: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", stream, bt_stream_get_id(stream), bt_stream_get_name(stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } if (bt_stream_class_supports_discarded_events(sc) && !bt_stream_class_discarded_events_have_default_clock_snapshots(sc)) { - BT_LOGE("Unsupported stream: discarded events " + BT_COMP_LOGE("Unsupported stream: discarded events " "have no clock snapshots: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", stream, bt_stream_get_id(stream), bt_stream_get_name(stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } if (bt_stream_class_supports_discarded_packets(sc) && !bt_stream_class_discarded_packets_have_default_clock_snapshots(sc)) { - BT_LOGE("Unsupported stream: discarded packets " + BT_COMP_LOGE("Unsupported stream: discarded packets " "have no clock snapshots: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", stream, bt_stream_get_id(stream), bt_stream_get_name(stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } sstate = g_new0(struct trimmer_iterator_stream_state, 1); if (!sstate) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_MEMORY_ERROR; goto end; } @@ -1809,7 +1593,7 @@ bt_self_message_iterator_status handle_message( /* Retrieve the message's time */ ret = get_msg_ns_from_origin(msg, &ns_from_origin, &skip); if (G_UNLIKELY(ret)) { - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -1834,7 +1618,7 @@ bt_self_message_iterator_status handle_message( *reached_end = true; } else { push_message(trimmer_it, msg); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; msg = NULL; } } @@ -1866,17 +1650,17 @@ void fill_message_array_from_output_messages( } static inline -bt_self_message_iterator_status state_ending( +bt_component_class_message_iterator_next_method_status state_ending( struct trimmer_iterator *trimmer_it, bt_message_array_const msgs, uint64_t capacity, uint64_t *count) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; if (g_queue_is_empty(trimmer_it->output_messages)) { trimmer_it->state = TRIMMER_ITERATOR_STATE_ENDED; - status = BT_SELF_MESSAGE_ITERATOR_STATUS_END; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_END; goto end; } @@ -1888,12 +1672,13 @@ end: } static inline -bt_self_message_iterator_status state_trim(struct trimmer_iterator *trimmer_it, +bt_component_class_message_iterator_next_method_status +state_trim(struct trimmer_iterator *trimmer_it, bt_message_array_const msgs, uint64_t capacity, uint64_t *count) { - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; bt_message_array_const my_msgs; uint64_t my_count; uint64_t i; @@ -1902,10 +1687,10 @@ bt_self_message_iterator_status state_trim(struct trimmer_iterator *trimmer_it, while (g_queue_is_empty(trimmer_it->output_messages)) { status = (int) bt_self_component_port_input_message_iterator_next( trimmer_it->upstream_iter, &my_msgs, &my_count); - if (G_UNLIKELY(status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK)) { - if (status == BT_SELF_MESSAGE_ITERATOR_STATUS_END) { + if (G_UNLIKELY(status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK)) { + if (status == BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_END) { status = end_iterator_streams(trimmer_it); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } @@ -1931,7 +1716,7 @@ bt_self_message_iterator_status state_trim(struct trimmer_iterator *trimmer_it, my_msgs[i] = NULL; if (G_UNLIKELY(status != - BT_SELF_MESSAGE_ITERATOR_STATUS_OK)) { + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK)) { put_messages(my_msgs, my_count); goto end; } @@ -1970,50 +1755,50 @@ end: } BT_HIDDEN -bt_self_message_iterator_status trimmer_msg_iter_next( +bt_component_class_message_iterator_next_method_status trimmer_msg_iter_next( bt_self_message_iterator *self_msg_iter, bt_message_array_const msgs, uint64_t capacity, uint64_t *count) { struct trimmer_iterator *trimmer_it = bt_self_message_iterator_get_data(self_msg_iter); - bt_self_message_iterator_status status = - BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + bt_component_class_message_iterator_next_method_status status = + BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; BT_ASSERT(trimmer_it); if (G_LIKELY(trimmer_it->state == TRIMMER_ITERATOR_STATE_TRIM)) { status = state_trim(trimmer_it, msgs, capacity, count); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } } else { switch (trimmer_it->state) { case TRIMMER_ITERATOR_STATE_SET_BOUNDS_NS_FROM_ORIGIN: status = state_set_trimmer_iterator_bounds(trimmer_it); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } status = state_seek_initially(trimmer_it); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } status = state_trim(trimmer_it, msgs, capacity, count); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } break; case TRIMMER_ITERATOR_STATE_SEEK_INITIALLY: status = state_seek_initially(trimmer_it); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } status = state_trim(trimmer_it, msgs, capacity, count); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } @@ -2021,13 +1806,13 @@ bt_self_message_iterator_status trimmer_msg_iter_next( case TRIMMER_ITERATOR_STATE_ENDING: status = state_ending(trimmer_it, msgs, capacity, count); - if (status != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { goto end; } break; case TRIMMER_ITERATOR_STATE_ENDED: - status = BT_SELF_MESSAGE_ITERATOR_STATUS_END; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_END; break; default: abort();