X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Ftext%2Ftext.c;h=3e2727622dca85cef6309ed2cc99103dac71cc39;hb=60535549d314d7784f2e5fcfcf8883ea6c428997;hp=89fa59901d63cac78c253175822b8e155d253017;hpb=3af83b5a0b18de8603239be8d7d50020d76c3d21;p=babeltrace.git diff --git a/plugins/text/text.c b/plugins/text/text.c index 89fa5990..3e272762 100644 --- a/plugins/text/text.c +++ b/plugins/text/text.c @@ -27,23 +27,30 @@ * SOFTWARE. */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#include +#include #include #include #include #include "text.h" - -#define PLUGIN_NAME "text" +#include static const char *plugin_options[] = { + "color", "output-path", "debug-info-dir", "debug-info-target-prefix", @@ -53,6 +60,7 @@ const char *plugin_options[] = { "clock-seconds", "clock-date", "clock-gmt", + "verbose", "name-default", /* show/hide */ "name-payload", "name-context", @@ -66,11 +74,13 @@ const char *plugin_options[] = { "field-trace:vpid", "field-loglevel", "field-emf", + "field-callsite", }; static void destroy_text_data(struct text_component *text) { + bt_put(text->input_iterator); (void) g_string_free(text->string, TRUE); g_free(text->options.output_path); g_free(text->options.debug_info_dir); @@ -100,9 +110,9 @@ error: } static -void destroy_text(struct bt_component *component) +void finalize_text(struct bt_private_component *component) { - void *data = bt_component_get_private_data(component); + void *data = bt_private_component_get_user_data(component); destroy_text_data(data); } @@ -119,11 +129,9 @@ enum bt_component_status handle_notification(struct text_component *text, } switch (bt_notification_get_type(notification)) { - case BT_NOTIFICATION_TYPE_PACKET_START: - puts(""); + case BT_NOTIFICATION_TYPE_PACKET_BEGIN: break; case BT_NOTIFICATION_TYPE_PACKET_END: - puts(""); break; case BT_NOTIFICATION_TYPE_EVENT: { @@ -142,7 +150,6 @@ enum bt_component_status handle_notification(struct text_component *text, break; } case BT_NOTIFICATION_TYPE_STREAM_END: - puts(""); break; default: puts("Unhandled notification type"); @@ -152,36 +159,61 @@ end: } static -enum bt_component_status run(struct bt_component *component) +enum bt_component_status text_accept_port_connection( + struct bt_private_component *component, + struct bt_private_port *self_port, + struct bt_port *other_port) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + struct bt_private_connection *connection; + struct text_component *text; + + text = bt_private_component_get_user_data(component); + assert(text); + assert(!text->input_iterator); + connection = bt_private_port_get_private_connection(self_port); + assert(connection); + text->input_iterator = + bt_private_connection_create_notification_iterator(connection); + + if (!text->input_iterator) { + ret = BT_COMPONENT_STATUS_ERROR; + } + + bt_put(connection); + return ret; +} + +static +enum bt_component_status run(struct bt_private_component *component) { enum bt_component_status ret; struct bt_notification *notification = NULL; struct bt_notification_iterator *it; - struct text_component *text = bt_component_get_private_data(component); + struct text_component *text = + bt_private_component_get_user_data(component); + enum bt_notification_iterator_status it_ret; - ret = bt_component_sink_get_input_iterator(component, 0, &it); - if (ret != BT_COMPONENT_STATUS_OK) { - goto end; - } + it = text->input_iterator; - if (!text->processed_first_event) { - ret = bt_notification_iterator_next(it); - if (ret != BT_COMPONENT_STATUS_OK) { - goto end; - } - } else { - text->processed_first_event = true; - } - - notification = bt_notification_iterator_get_notification(it); - if (!notification) { + it_ret = bt_notification_iterator_next(it); + switch (it_ret) { + case BT_NOTIFICATION_ITERATOR_STATUS_ERROR: ret = BT_COMPONENT_STATUS_ERROR; goto end; + case BT_NOTIFICATION_ITERATOR_STATUS_END: + ret = BT_COMPONENT_STATUS_END; + BT_PUT(text->input_iterator); + goto end; + default: + break; } + notification = bt_notification_iterator_get_notification(it); + assert(notification); ret = handle_notification(text, notification); + text->processed_first_event = true; end: - bt_put(it); bt_put(notification); return ret; } @@ -217,8 +249,7 @@ bool check_param_exists(const char *key, struct bt_value *object, void *data) if (!bt_value_map_get(plugin_opt_map, key)) { fprintf(text->err, - "[warning] Parameter \"%s\" unknown to \"%s\" plugin\n", - key, PLUGIN_NAME); + "[warning] Parameter \"%s\" unknown to \"text\" plugin\n", key); } return true; } @@ -284,6 +315,13 @@ end: return ret; } +static +void warn_wrong_color_param(struct text_component *text) +{ + fprintf(text->err, + "[warning] Accepted values for the \"color\" parameter are:\n \"always\", \"auto\", \"never\"\n"); +} + static enum bt_component_status apply_params(struct text_component *text, struct bt_value *params) @@ -312,6 +350,34 @@ enum bt_component_status apply_params(struct text_component *text, goto end; } /* Known parameters. */ + text->options.color = TEXT_COLOR_OPT_AUTO; + if (bt_value_map_has_key(params, "color")) { + struct bt_value *color_value; + const char *color; + + color_value = bt_value_map_get(params, "color"); + if (!color_value) { + goto end; + } + + status = bt_value_string_get(color_value, &color); + if (status) { + warn_wrong_color_param(text); + } else { + if (strcmp(color, "never") == 0) { + text->options.color = TEXT_COLOR_OPT_NEVER; + } else if (strcmp(color, "auto") == 0) { + text->options.color = TEXT_COLOR_OPT_AUTO; + } else if (strcmp(color, "always") == 0) { + text->options.color = TEXT_COLOR_OPT_ALWAYS; + } else { + warn_wrong_color_param(text); + } + } + + bt_put(color_value); + } + ret = apply_one_string("output-path", params, &text->options.output_path); @@ -375,6 +441,13 @@ enum bt_component_status apply_params(struct text_component *text, } text->options.clock_gmt = value; + value = false; /* Default. */ + ret = apply_one_bool("verbose", params, &value, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + text->options.verbose = value; + /* Names. */ ret = apply_one_string("name-default", params, &str); if (ret != BT_COMPONENT_STATUS_OK) { @@ -484,7 +557,7 @@ enum bt_component_status apply_params(struct text_component *text, text->options.print_trace_vpid_field = true; text->options.print_loglevel_field = false; text->options.print_emf_field = false; - text->options.print_emf_field = false; + text->options.print_callsite_field = false; break; case TEXT_DEFAULT_SHOW: text->options.print_trace_field = true; @@ -494,7 +567,7 @@ enum bt_component_status apply_params(struct text_component *text, text->options.print_trace_vpid_field = true; text->options.print_loglevel_field = true; text->options.print_emf_field = true; - text->options.print_emf_field = true; + text->options.print_callsite_field = true; break; case TEXT_DEFAULT_HIDE: text->options.print_trace_field = false; @@ -504,7 +577,7 @@ enum bt_component_status apply_params(struct text_component *text, text->options.print_trace_vpid_field = false; text->options.print_loglevel_field = false; text->options.print_emf_field = false; - text->options.print_emf_field = false; + text->options.print_callsite_field = false; break; default: ret = BT_COMPONENT_STATUS_ERROR; @@ -583,12 +656,12 @@ enum bt_component_status apply_params(struct text_component *text, value = false; found = false; - ret = apply_one_bool("field-emf", params, &value, &found); + ret = apply_one_bool("field-callsite", params, &value, &found); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } if (found) { - text->options.print_emf_field = value; + text->options.print_callsite_field = value; } end: @@ -598,9 +671,47 @@ end: return ret; } +static +void set_use_colors(struct text_component *text) +{ + switch (text->options.color) { + case TEXT_COLOR_OPT_ALWAYS: + text->use_colors = true; + break; + case TEXT_COLOR_OPT_AUTO: + text->use_colors = text->out == stdout && + bt_common_colors_supported(); + break; + case TEXT_COLOR_OPT_NEVER: + text->use_colors = false; + break; + } +} + +static +void init_stream_packet_context_quarks(void) +{ + stream_packet_context_quarks[Q_TIMESTAMP_BEGIN] = + g_quark_from_string("timestamp_begin"); + stream_packet_context_quarks[Q_TIMESTAMP_BEGIN] = + g_quark_from_string("timestamp_begin"); + stream_packet_context_quarks[Q_TIMESTAMP_END] = + g_quark_from_string("timestamp_end"); + stream_packet_context_quarks[Q_EVENTS_DISCARDED] = + g_quark_from_string("events_discarded"); + stream_packet_context_quarks[Q_CONTENT_SIZE] = + g_quark_from_string("content_size"); + stream_packet_context_quarks[Q_PACKET_SIZE] = + g_quark_from_string("packet_size"); + stream_packet_context_quarks[Q_PACKET_SEQ_NUM] = + g_quark_from_string("packet_seq_num"); +} + static enum bt_component_status text_component_init( - struct bt_component *component, struct bt_value *params) + struct bt_private_component *component, + struct bt_value *params, + UNUSED_VAR void *init_method_data) { enum bt_component_status ret; struct text_component *text = create_text(); @@ -624,22 +735,15 @@ enum bt_component_status text_component_init( goto error; } - ret = bt_component_set_destroy_cb(component, - destroy_text); - if (ret != BT_COMPONENT_STATUS_OK) { - goto error; - } + set_use_colors(text); - ret = bt_component_set_private_data(component, text); + ret = bt_private_component_set_user_data(component, text); if (ret != BT_COMPONENT_STATUS_OK) { goto error; } - ret = bt_component_sink_set_consume_cb(component, - run); - if (ret != BT_COMPONENT_STATUS_OK) { - goto error; - } + init_stream_packet_context_quarks(); + end: return ret; error: @@ -648,13 +752,13 @@ error: } /* Initialize plug-in entry points. */ -BT_PLUGIN_NAME("text"); +BT_PLUGIN(text); BT_PLUGIN_DESCRIPTION("Babeltrace text output plug-in."); BT_PLUGIN_AUTHOR("Jérémie Galarneau"); BT_PLUGIN_LICENSE("MIT"); - -BT_PLUGIN_COMPONENT_CLASSES_BEGIN -BT_PLUGIN_SINK_COMPONENT_CLASS_ENTRY(PLUGIN_NAME, - "Formats CTF-IR to text. Formerly known as ctf-text.", - text_component_init) -BT_PLUGIN_COMPONENT_CLASSES_END +BT_PLUGIN_SINK_COMPONENT_CLASS(text, run); +BT_PLUGIN_SINK_COMPONENT_CLASS_INIT_METHOD(text, text_component_init); +BT_PLUGIN_SINK_COMPONENT_CLASS_ACCEPT_PORT_CONNECTION_METHOD(text, text_accept_port_connection); +BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD(text, finalize_text); +BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION(text, + "Formats CTF-IR to text. Formerly known as ctf-text.");