X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Ftext%2Fpretty%2Fpretty.c;h=1010917d09faada2fa8ef6510b53f3fc8f1bed4b;hb=d4393e0875e7b08f6ee97d617cc5f2c9286742a4;hp=87efe05aa1cb441801b29867389023fe6d237897;hpb=78d155512ce761c6b5d261d7ed98436c3493b53f;p=babeltrace.git diff --git a/plugins/text/pretty/pretty.c b/plugins/text/pretty/pretty.c index 87efe05a..1010917d 100644 --- a/plugins/text/pretty/pretty.c +++ b/plugins/text/pretty/pretty.c @@ -27,17 +27,7 @@ * SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include #include #include @@ -45,14 +35,16 @@ #include #include #include -#include +#include #include "pretty.h" +GQuark stream_packet_context_quarks[STREAM_PACKET_CONTEXT_QUARKS_LEN]; + static const char *plugin_options[] = { "color", - "output-path", + "path", "no-delta", "clock-cycles", "clock-seconds", @@ -79,7 +71,15 @@ static void destroy_pretty_data(struct pretty_component *pretty) { bt_put(pretty->input_iterator); - (void) g_string_free(pretty->string, TRUE); + + if (pretty->string) { + (void) g_string_free(pretty->string, TRUE); + } + + if (pretty->tmp_string) { + (void) g_string_free(pretty->tmp_string, TRUE); + } + if (pretty->out != stdout) { int ret; @@ -105,6 +105,10 @@ struct pretty_component *create_pretty(void) if (!pretty->string) { goto error; } + pretty->tmp_string = g_string_new(""); + if (!pretty->tmp_string) { + goto error; + } end: return pretty; @@ -127,30 +131,23 @@ enum bt_component_status handle_notification(struct pretty_component *pretty, { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - if (!pretty) { - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - } + BT_ASSERT(pretty); switch (bt_notification_get_type(notification)) { - case BT_NOTIFICATION_TYPE_PACKET_BEGIN: - break; - case BT_NOTIFICATION_TYPE_PACKET_END: - break; case BT_NOTIFICATION_TYPE_EVENT: - { ret = pretty_print_event(pretty, notification); - if (ret != BT_COMPONENT_STATUS_OK) { - goto end; - } break; - } - case BT_NOTIFICATION_TYPE_STREAM_END: + case BT_NOTIFICATION_TYPE_INACTIVITY: + fprintf(stderr, "Inactivity notification\n"); + break; + case BT_NOTIFICATION_TYPE_DISCARDED_PACKETS: + case BT_NOTIFICATION_TYPE_DISCARDED_EVENTS: + ret = pretty_print_discarded_elements(pretty, notification); break; default: - puts("Unhandled notification type"); + break; } -end: + return ret; } @@ -160,18 +157,18 @@ void pretty_port_connected( struct bt_private_port *self_port, struct bt_port *other_port) { + enum bt_connection_status conn_status; struct bt_private_connection *connection; struct pretty_component *pretty; pretty = bt_private_component_get_user_data(component); - assert(pretty); - assert(!pretty->input_iterator); + BT_ASSERT(pretty); + BT_ASSERT(!pretty->input_iterator); connection = bt_private_port_get_private_connection(self_port); - assert(connection); - pretty->input_iterator = - bt_private_connection_create_notification_iterator(connection); - - if (!pretty->input_iterator) { + BT_ASSERT(connection); + conn_status = bt_private_connection_create_notification_iterator( + connection, &pretty->input_iterator); + if (conn_status != BT_CONNECTION_STATUS_OK) { pretty->error = true; } @@ -182,11 +179,13 @@ BT_HIDDEN enum bt_component_status pretty_consume(struct bt_private_component *component) { enum bt_component_status ret; - struct bt_notification *notification = NULL; + bt_notification_array notifs; struct bt_notification_iterator *it; struct pretty_component *pretty = bt_private_component_get_user_data(component); enum bt_notification_iterator_status it_ret; + uint64_t count = 0; + uint64_t i = 0; if (unlikely(pretty->error)) { ret = BT_COMPONENT_STATUS_ERROR; @@ -194,25 +193,40 @@ enum bt_component_status pretty_consume(struct bt_private_component *component) } it = pretty->input_iterator; - it_ret = bt_notification_iterator_next(it); + it_ret = bt_private_connection_notification_iterator_next(it, ¬ifs, + &count); 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(pretty->input_iterator); goto end; - default: + case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN: + ret = BT_COMPONENT_STATUS_AGAIN; + goto end; + case BT_NOTIFICATION_ITERATOR_STATUS_OK: break; + default: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + } + + BT_ASSERT(it_ret == BT_NOTIFICATION_ITERATOR_STATUS_OK); + + for (i = 0; i < count; i++) { + ret = handle_notification(pretty, notifs[i]); + if (ret) { + goto end; + } + + bt_put(notifs[i]); } - notification = bt_notification_iterator_get_notification(it); - assert(notification); - ret = handle_notification(pretty, notification); end: - bt_put(notification); + for (; i < count; i++) { + bt_put(notifs[i]); + } + return ret; } @@ -240,16 +254,16 @@ end: } static -bool check_param_exists(const char *key, struct bt_value *object, void *data) +bt_bool check_param_exists(const char *key, struct bt_value *object, void *data) { struct pretty_component *pretty = data; struct bt_value *plugin_opt_map = pretty->plugin_opt_map; - if (!bt_value_map_get(plugin_opt_map, key)) { + if (!bt_value_map_has_key(plugin_opt_map, key)) { fprintf(pretty->err, "[warning] Parameter \"%s\" unknown to \"text.pretty\" sink component\n", key); } - return true; + return BT_TRUE; } static @@ -262,7 +276,7 @@ enum bt_component_status apply_one_string(const char *key, enum bt_value_status status; const char *str; - value = bt_value_map_get(params, key); + value = bt_value_map_borrow(params, key); if (!value) { goto end; } @@ -279,7 +293,6 @@ enum bt_component_status apply_one_string(const char *key, } *option = g_strdup(str); end: - bt_put(value); return ret; } @@ -292,12 +305,13 @@ enum bt_component_status apply_one_bool(const char *key, enum bt_component_status ret = BT_COMPONENT_STATUS_OK; struct bt_value *value = NULL; enum bt_value_status status; + bt_bool bool_val; - value = bt_value_map_get(params, key); + value = bt_value_map_borrow(params, key); if (!value) { goto end; } - status = bt_value_bool_get(value, option); + status = bt_value_bool_get(value, &bool_val); switch (status) { case BT_VALUE_STATUS_OK: break; @@ -305,11 +319,12 @@ enum bt_component_status apply_one_bool(const char *key, ret = BT_COMPONENT_STATUS_ERROR; goto end; } + *option = (bool) bool_val; if (found) { *found = true; } + end: - bt_put(value); return ret; } @@ -375,7 +390,7 @@ enum bt_component_status apply_params(struct pretty_component *pretty, struct bt_value *color_value; const char *color; - color_value = bt_value_map_get(params, "color"); + color_value = bt_value_map_borrow(params, "color"); if (!color_value) { goto end; } @@ -394,13 +409,9 @@ enum bt_component_status apply_params(struct pretty_component *pretty, warn_wrong_color_param(pretty); } } - - bt_put(color_value); } - ret = apply_one_string("output-path", - params, - &pretty->options.output_path); + ret = apply_one_string("path", params, &pretty->options.output_path); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } @@ -724,6 +735,12 @@ enum bt_component_status pretty_init( goto end; } + ret = bt_private_component_sink_add_input_private_port(component, + "in", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + pretty->out = stdout; pretty->err = stderr; @@ -739,7 +756,6 @@ enum bt_component_status pretty_init( } set_use_colors(pretty); - ret = bt_private_component_set_user_data(component, pretty); if (ret != BT_COMPONENT_STATUS_OK) { goto error;