X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Futils%2Ftrimmer%2Ftrimmer.c;h=5134fdc98152000bb5cfbe5f8cde3f0432f4205b;hb=c49bf79b7d7e87cc21d065a7d208bcc238fb0800;hp=c1c0f6921458cf963f814e41a80f31c4f9e94284;hpb=37a93d415ba5a4d839a89157d91496f21c367a96;p=babeltrace.git diff --git a/src/plugins/utils/trimmer/trimmer.c b/src/plugins/utils/trimmer/trimmer.c index c1c0f692..5134fdc9 100644 --- a/src/plugins/utils/trimmer/trimmer.c +++ b/src/plugins/utils/trimmer/trimmer.c @@ -21,10 +21,9 @@ * SOFTWARE. */ -#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 "logging/comp-logging.h" #include "compat/utc.h" #include "compat/time.h" @@ -422,7 +421,8 @@ int set_bound_from_str(struct trimmer_comp *trimmer_comp, goto end; } - BT_COMP_LOGE("Invalid date/time format: param=\"%s\"", str); + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Invalid date/time format: param=\"%s\"", str); ret = -1; end: @@ -445,7 +445,7 @@ int set_bound_from_param(struct trimmer_comp *trimmer_comp, char tmp_arg[64]; if (bt_value_is_signed_integer(param)) { - int64_t value = bt_value_signed_integer_get(param); + int64_t value = bt_value_integer_signed_get(param); /* * Just convert it to a temporary string to handle @@ -456,7 +456,8 @@ int set_bound_from_param(struct trimmer_comp *trimmer_comp, } else if (bt_value_is_string(param)) { arg = bt_value_string_get(param); } else { - BT_COMP_LOGE("`%s` parameter must be an integer or a string value.", + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "`%s` parameter must be an integer or a string value.", param_name); ret = -1; goto end; @@ -479,7 +480,8 @@ int validate_trimmer_bounds(struct trimmer_comp *trimmer_comp, if (!begin->is_infinite && !end->is_infinite && begin->ns_from_origin > end->ns_from_origin) { - BT_COMP_LOGE("Trimming time range's beginning time is greater than end time: " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "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, @@ -489,7 +491,8 @@ int validate_trimmer_bounds(struct trimmer_comp *trimmer_comp, } if (!begin->is_infinite && begin->ns_from_origin == INT64_MIN) { - BT_COMP_LOGE("Invalid trimming time range's beginning time: " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Invalid trimming time range's beginning time: " "ns-from-origin=%" PRId64, begin->ns_from_origin); ret = -1; @@ -497,7 +500,8 @@ int validate_trimmer_bounds(struct trimmer_comp *trimmer_comp, } if (!end->is_infinite && end->ns_from_origin == INT64_MIN) { - BT_COMP_LOGE("Invalid trimming time range's end time: " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Invalid trimming time range's end time: " "ns-from-origin=%" PRId64, end->ns_from_origin); ret = -1; @@ -557,19 +561,20 @@ end: return ret; } -bt_component_class_init_method_status trimmer_init( +bt_component_class_initialize_method_status trimmer_init( bt_self_component_filter *self_comp_flt, + bt_self_component_filter_configuration *config, const bt_value *params, void *init_data) { int ret; - bt_component_class_init_method_status status = - BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK; + bt_component_class_initialize_method_status status = + BT_COMPONENT_CLASS_INITIALIZE_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_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } @@ -580,10 +585,10 @@ bt_component_class_init_method_status trimmer_init( 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; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto error; case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; default: break; @@ -593,10 +598,10 @@ bt_component_class_init_method_status trimmer_init( 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; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto error; case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; default: break; @@ -604,7 +609,7 @@ bt_component_class_init_method_status trimmer_init( ret = init_trimmer_comp_from_params(trimmer_comp, params); if (ret) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto error; } @@ -612,8 +617,8 @@ bt_component_class_init_method_status trimmer_init( goto end; error: - if (status == BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; + if (status == BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; } if (trimmer_comp) { @@ -627,7 +632,10 @@ end: static void destroy_trimmer_iterator(struct trimmer_iterator *trimmer_it) { - BT_ASSERT(trimmer_it); + if (!trimmer_it) { + goto end; + } + bt_self_component_port_input_message_iterator_put_ref( trimmer_it->upstream_iter); @@ -640,6 +648,8 @@ void destroy_trimmer_iterator(struct trimmer_iterator *trimmer_it) } g_free(trimmer_it); +end: + return; } static @@ -652,19 +662,21 @@ void destroy_trimmer_iterator_stream_state( } BT_HIDDEN -bt_component_class_message_iterator_init_method_status trimmer_msg_iter_init( +bt_component_class_message_iterator_initialize_method_status trimmer_msg_iter_init( bt_self_message_iterator *self_msg_iter, + bt_self_message_iterator_configuration *config, bt_self_component_filter *self_comp, bt_self_component_port_output *port) { - bt_component_class_message_iterator_init_method_status status = - BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_OK; + bt_component_class_message_iterator_initialize_method_status status; + bt_self_component_port_input_message_iterator_create_from_message_iterator_status + msg_iter_status; struct trimmer_iterator *trimmer_it; trimmer_it = g_new0(struct trimmer_iterator, 1); if (!trimmer_it) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; - goto end; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; + goto error; } trimmer_it->trimmer_comp = bt_self_component_get_data( @@ -684,37 +696,47 @@ bt_component_class_message_iterator_init_method_status trimmer_msg_iter_init( trimmer_it->begin = trimmer_it->trimmer_comp->begin; trimmer_it->end = trimmer_it->trimmer_comp->end; - trimmer_it->upstream_iter = - bt_self_component_port_input_message_iterator_create( + msg_iter_status = + bt_self_component_port_input_message_iterator_create_from_message_iterator( + self_msg_iter, bt_self_component_filter_borrow_input_port_by_name( - self_comp, in_port_name)); - if (!trimmer_it->upstream_iter) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_ERROR; - goto end; + self_comp, in_port_name), &trimmer_it->upstream_iter); + if (msg_iter_status != BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_CREATE_FROM_MESSAGE_ITERATOR_STATUS_OK) { + status = (int) msg_iter_status; + goto error; } trimmer_it->output_messages = g_queue_new(); if (!trimmer_it->output_messages) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; - goto end; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; + goto error; } trimmer_it->stream_states = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) destroy_trimmer_iterator_stream_state); if (!trimmer_it->stream_states) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; - goto end; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; + goto error; } + /* + * The trimmer requires upstream messages to have times, so it can + * always seek forward. + */ + bt_self_message_iterator_configuration_set_can_seek_forward( + config, BT_TRUE); + trimmer_it->self_msg_iter = self_msg_iter; bt_self_message_iterator_set_data(self_msg_iter, trimmer_it); -end: - if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_OK && trimmer_it) { - destroy_trimmer_iterator(trimmer_it); - } + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_OK; + goto end; +error: + destroy_trimmer_iterator(trimmer_it); + +end: return status; } @@ -866,6 +888,7 @@ int set_trimmer_iterator_bound(struct trimmer_iterator *trimmer_it, { struct trimmer_comp *trimmer_comp = trimmer_it->trimmer_comp; struct tm tm; + struct tm *res; time_t time_seconds = (time_t) (ns_from_origin / NS_PER_S); int ret = 0; @@ -874,14 +897,15 @@ int set_trimmer_iterator_bound(struct trimmer_iterator *trimmer_it, /* We only need to extract the date from this time */ if (is_gmt) { - bt_gmtime_r(&time_seconds, &tm); + res = bt_gmtime_r(&time_seconds, &tm); } else { - bt_localtime_r(&time_seconds, &tm); + res = bt_localtime_r(&time_seconds, &tm); } - if (errno) { - BT_COMP_LOGE_ERRNO("Cannot convert timestamp to date and time", - "ts=%" PRId64, (int64_t) time_seconds); + if (!res) { + BT_COMP_LOGE_APPEND_CAUSE_ERRNO(trimmer_comp->self_comp, + "Cannot convert timestamp to date and time", + ": ts=%" PRId64, (int64_t) time_seconds); ret = -1; goto end; } @@ -983,15 +1007,27 @@ bt_component_class_message_iterator_next_method_status state_seek_initially( struct trimmer_iterator *trimmer_it) { 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_component_class_message_iterator_next_method_status status; 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_COMP_LOGE_STR("Cannot make upstream message iterator initially seek its beginning."); + bt_bool can_seek; + + status = (int) bt_self_component_port_input_message_iterator_can_seek_beginning( + trimmer_it->upstream_iter, &can_seek); + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { + if (status < 0) { + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Cannot make upstream message iterator initially seek its beginning."); + } + + goto end; + } + + if (!can_seek) { + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Cannot make upstream message iterator initially seek its beginning."); status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -999,11 +1035,25 @@ bt_component_class_message_iterator_next_method_status state_seek_initially( status = (int) bt_self_component_port_input_message_iterator_seek_beginning( trimmer_it->upstream_iter); } else { - if (!bt_self_component_port_input_message_iterator_can_seek_ns_from_origin( - trimmer_it->upstream_iter, - trimmer_it->begin.ns_from_origin)) { - BT_COMP_LOGE("Cannot make upstream message iterator initially seek: " - "seek-ns-from-origin=%" PRId64, + bt_bool can_seek; + + status = (int) bt_self_component_port_input_message_iterator_can_seek_ns_from_origin( + trimmer_it->upstream_iter, trimmer_it->begin.ns_from_origin, + &can_seek); + + if (status != BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK) { + if (status < 0) { + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Cannot make upstream message iterator initially seek: seek-ns-from-origin=%" PRId64, + trimmer_it->begin.ns_from_origin); + } + + goto end; + } + + if (!can_seek) { + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Cannot make upstream message iterator initially seek: seek-ns-from-origin=%" PRId64, trimmer_it->begin.ns_from_origin); status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; goto end; @@ -1202,7 +1252,8 @@ create_stream_state_entry( */ sc = bt_stream_borrow_class_const(stream); if (!bt_stream_class_borrow_default_clock_class_const(sc)) { - BT_COMP_LOGE("Unsupported stream: stream class does " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Unsupported stream: stream class does " "not have a default clock class: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " @@ -1222,8 +1273,8 @@ create_stream_state_entry( */ if (!bt_stream_class_packets_have_beginning_default_clock_snapshot( sc)) { - BT_COMP_LOGE("Unsupported stream: packets have " - "no beginning clock snapshot: " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Unsupported stream: packets have no beginning clock snapshot: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", @@ -1235,8 +1286,8 @@ create_stream_state_entry( if (!bt_stream_class_packets_have_end_default_clock_snapshot( sc)) { - BT_COMP_LOGE("Unsupported stream: packets have " - "no end clock snapshot: " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Unsupported stream: packets have no end clock snapshot: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", @@ -1248,8 +1299,8 @@ create_stream_state_entry( if (bt_stream_class_supports_discarded_events(sc) && !bt_stream_class_discarded_events_have_default_clock_snapshots(sc)) { - BT_COMP_LOGE("Unsupported stream: discarded events " - "have no clock snapshots: " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Unsupported stream: discarded events have no clock snapshots: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " "stream-name=\"%s\"", @@ -1261,7 +1312,8 @@ create_stream_state_entry( if (bt_stream_class_supports_discarded_packets(sc) && !bt_stream_class_discarded_packets_have_default_clock_snapshots(sc)) { - BT_COMP_LOGE("Unsupported stream: discarded packets " + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, + "Unsupported stream: discarded packets " "have no clock snapshots: " "stream-addr=%p, " "stream-id=%" PRIu64 ", " @@ -1597,7 +1649,7 @@ bt_component_class_message_iterator_next_method_status handle_message( bt_component_class_message_iterator_next_method_status status; const bt_stream *stream = NULL; int64_t ns_from_origin = INT64_MIN; - bool has_ns_from_origin; + bool has_ns_from_origin = false; int ret; /* Find message's associated stream */