static
void destroy_pretty_data(struct pretty_component *pretty)
{
+ uint64_t i;
if (!pretty) {
goto end;
}
perror("close output file");
}
}
+
+ for (i = 0; i < ENUMERATION_MAX_BITFLAGS_COUNT; i++) {
+ if (pretty->enum_bit_labels[i]) {
+ g_ptr_array_free(pretty->enum_bit_labels[i], true);
+ }
+ }
+
g_free(pretty->options.output_path);
g_free(pretty);
switch (bt_message_get_type(message)) {
case BT_MESSAGE_TYPE_EVENT:
if (pretty_print_event(pretty, message)) {
+ BT_COMP_LOGE_APPEND_CAUSE(pretty->self_comp,
+ "Failed to print one event.");
ret = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR;
}
break;
case BT_MESSAGE_TYPE_DISCARDED_EVENTS:
case BT_MESSAGE_TYPE_DISCARDED_PACKETS:
if (pretty_print_discarded_items(pretty, message)) {
+ BT_COMP_LOGE_APPEND_CAUSE(pretty->self_comp,
+ "Failed to print discarded items.");
ret = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR;
}
break;
bt_component_class_sink_consume_method_status pretty_consume(
bt_self_component_sink *comp)
{
- bt_component_class_sink_consume_method_status ret =
- BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK;
+ bt_component_class_sink_consume_method_status status;
bt_message_array_const msgs;
bt_message_iterator *it;
struct pretty_component *pretty = bt_self_component_get_data(
it = pretty->iterator;
next_status = bt_message_iterator_next(it,
&msgs, &count);
-
- switch (next_status) {
- case BT_MESSAGE_ITERATOR_NEXT_STATUS_OK:
- break;
- case BT_MESSAGE_ITERATOR_NEXT_STATUS_MEMORY_ERROR:
- case BT_MESSAGE_ITERATOR_NEXT_STATUS_AGAIN:
- ret = (int) next_status;
- goto end;
- case BT_MESSAGE_ITERATOR_NEXT_STATUS_END:
- ret = (int) next_status;
- BT_MESSAGE_ITERATOR_PUT_REF_AND_RESET(
- pretty->iterator);
- goto end;
- default:
- ret = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR;
+ if (next_status != BT_MESSAGE_ITERATOR_NEXT_STATUS_OK) {
+ status = (int) next_status;
goto end;
}
- BT_ASSERT_DBG(next_status == BT_MESSAGE_ITERATOR_NEXT_STATUS_OK);
-
for (i = 0; i < count; i++) {
- ret = (int) handle_message(pretty, msgs[i]);
- if (ret) {
+ status = (int) handle_message(pretty, msgs[i]);
+ if (status) {
goto end;
}
bt_message_put_ref(msgs[i]);
}
+ status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK;
+
end:
for (; i < count; i++) {
bt_message_put_ref(msgs[i]);
}
- return ret;
+ return status;
}
static
{ "field-loglevel", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } },
{ "field-emf", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } },
{ "field-callsite", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } },
+ { "print-enum-flags", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } },
BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END
};
apply_one_string("path", params, &pretty->options.output_path);
ret = open_output_file(pretty);
if (ret) {
+ BT_COMP_LOGE_APPEND_CAUSE(pretty->self_comp,
+ "Failed to open output file: %s", validate_error);
status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
goto end;
}
apply_one_bool_with_default("verbose", params,
&pretty->options.verbose, false);
+ apply_one_bool_with_default("print-enum-flags", params,
+ &pretty->options.print_enum_flags, false);
+
/* Names. */
value = bt_value_map_borrow_entry_value_const(params, "name-default");
if (value) {
bt_logging_level log_level = bt_component_get_logging_level(comp);
if (!pretty) {
+ /*
+ * Don't use BT_COMP_LOGE_APPEND_CAUSE, as `pretty` is not
+ * initialized yet.
+ */
+ BT_COMP_LOG_CUR_LVL(BT_LOG_ERROR, log_level, self_comp,
+ "Failed to allocate component.");
+ BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(
+ self_comp, "Failed to allocate component.");
status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR;
goto error;
}
}
set_use_colors(pretty);
+
+ if (pretty->options.print_enum_flags) {
+ uint64_t i;
+ /*
+ * Allocate all label arrays during the initialization of the
+ * component and reuse the same set of arrays for all
+ * enumerations.
+ */
+ for (i = 0; i < ENUMERATION_MAX_BITFLAGS_COUNT; i++) {
+ pretty->enum_bit_labels[i] = g_ptr_array_new();
+ }
+ }
bt_self_component_set_data(self_comp, pretty);
status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK;