X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Flttng-utils%2Fplugin.c;h=09740c677308d1542452a5ca8011a8b32a313878;hb=b19ff26f04df428047676dd736bd7cc9473906fe;hp=e7cffbd1c57ff0e019a976fef99ee4ef7f4c7fa9;hpb=456a4476cac0e5b5e5bec47a07243faee091eb72;p=babeltrace.git diff --git a/plugins/lttng-utils/plugin.c b/plugins/lttng-utils/plugin.c index e7cffbd1..09740c67 100644 --- a/plugins/lttng-utils/plugin.c +++ b/plugins/lttng-utils/plugin.c @@ -26,23 +26,26 @@ * SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#define BT_LOG_TAG "PLUGIN-CTF-LTTNG-UTILS-DEBUG-INFO-FLT" +#include "logging.h" + +#include #include -#include +#include #include "debug-info.h" #include "copy.h" +static +gboolean empty_trace_map(gpointer key, gpointer value, gpointer user_data) +{ + struct debug_info_trace *di_trace = value; + + di_trace->trace_static = 1; + debug_info_close_trace(di_trace->debug_it, di_trace); + + return TRUE; +} + static void destroy_debug_info_data(struct debug_info_component *debug_info) { @@ -51,9 +54,9 @@ void destroy_debug_info_data(struct debug_info_component *debug_info) } static -void destroy_debug_info_component(struct bt_private_component *component) +void destroy_debug_info_component(bt_self_component *component) { - void *data = bt_private_component_get_user_data(component); + void *data = bt_self_component_get_user_data(component); destroy_debug_info_data(data); } @@ -73,107 +76,86 @@ end: } static -void unref_debug_info(struct debug_info *debug_info) -{ - debug_info_destroy(debug_info); -} - -static -void unref_trace(struct bt_ctf_trace *trace) -{ - bt_put(trace); -} - -static -void unref_stream(struct bt_ctf_stream *stream) -{ - bt_put(stream); -} - -static -void unref_packet(struct bt_ctf_packet *packet) +void unref_trace(struct debug_info_trace *di_trace) { - bt_put(packet); + bt_trace_put_ref(di_trace->writer_trace); + g_free(di_trace); } static -void unref_stream_class(struct bt_ctf_stream_class *stream_class) -{ - bt_put(stream_class); -} - -static -void debug_info_iterator_destroy(struct bt_private_notification_iterator *it) +void debug_info_iterator_destroy(bt_self_notification_iterator *it) { struct debug_info_iterator *it_data; - it_data = bt_private_notification_iterator_get_user_data(it); - assert(it_data); + it_data = bt_self_notification_iterator_get_user_data(it); + BT_ASSERT(it_data); if (it_data->input_iterator_group) { g_ptr_array_free(it_data->input_iterator_group, TRUE); } - bt_put(it_data->current_notification); - bt_put(it_data->input_iterator); + + g_hash_table_foreach_remove(it_data->trace_map, + empty_trace_map, it_data); g_hash_table_destroy(it_data->trace_map); - g_hash_table_destroy(it_data->stream_map); - g_hash_table_destroy(it_data->stream_class_map); - g_hash_table_destroy(it_data->packet_map); - g_hash_table_destroy(it_data->trace_debug_map); + + bt_notification_put_ref(it_data->current_notification); + bt_object_put_ref(it_data->input_iterator); + g_free(it_data); } static -struct bt_notification *handle_notification(FILE *err, +const bt_notification *handle_notification(FILE *err, struct debug_info_iterator *debug_it, - struct bt_notification *notification) + const bt_notification *notification) { - struct bt_notification *new_notification = NULL; + const bt_notification *new_notification = NULL; switch (bt_notification_get_type(notification)) { - case BT_NOTIFICATION_TYPE_PACKET_BEGIN: + case BT_NOTIFICATION_TYPE_PACKET_BEGINNING: { - struct bt_ctf_packet *packet = - bt_notification_packet_begin_get_packet(notification); - struct bt_ctf_packet *writer_packet; + const bt_packet *packet = + bt_notification_packet_beginning_get_packet(notification); + const bt_packet *writer_packet; if (!packet) { goto end; } writer_packet = debug_info_new_packet(debug_it, packet); - assert(writer_packet); - new_notification = bt_notification_packet_begin_create( + BT_ASSERT(writer_packet); + new_notification = bt_notification_packet_beginning_create( writer_packet); - assert(new_notification); - bt_put(packet); + BT_ASSERT(new_notification); + bt_packet_put_ref(packet); + bt_packet_put_ref(writer_packet); break; } case BT_NOTIFICATION_TYPE_PACKET_END: { - struct bt_ctf_packet *packet = + const bt_packet *packet = bt_notification_packet_end_get_packet(notification); - struct bt_ctf_packet *writer_packet; + const bt_packet *writer_packet; if (!packet) { goto end; } writer_packet = debug_info_close_packet(debug_it, packet); - assert(writer_packet); + BT_ASSERT(writer_packet); new_notification = bt_notification_packet_end_create( writer_packet); - assert(new_notification); - bt_put(packet); - bt_put(writer_packet); + BT_ASSERT(new_notification); + bt_packet_put_ref(packet); + bt_packet_put_ref(writer_packet); break; } case BT_NOTIFICATION_TYPE_EVENT: { - struct bt_ctf_event *event = bt_notification_event_get_event( + const bt_event *event = bt_notification_event_get_event( notification); - struct bt_ctf_event *writer_event; - struct bt_clock_class_priority_map *cc_prio_map = + const bt_event *writer_event; + bt_clock_class_priority_map *cc_prio_map = bt_notification_event_get_clock_class_priority_map( notification); @@ -181,36 +163,56 @@ struct bt_notification *handle_notification(FILE *err, goto end; } writer_event = debug_info_output_event(debug_it, event); - assert(writer_event); + BT_ASSERT(writer_event); new_notification = bt_notification_event_create(writer_event, cc_prio_map); - bt_put(cc_prio_map); - assert(new_notification); - bt_put(event); - bt_put(writer_event); + bt_object_put_ref(cc_prio_map); + BT_ASSERT(new_notification); + bt_object_put_ref(event); + bt_object_put_ref(writer_event); + break; + } + case BT_NOTIFICATION_TYPE_STREAM_BEGINNING: + { + const bt_stream *stream = + bt_notification_stream_beginning_get_stream(notification); + const bt_stream *writer_stream; + + if (!stream) { + goto end; + } + + writer_stream = debug_info_stream_begin(debug_it, stream); + BT_ASSERT(writer_stream); + new_notification = bt_notification_stream_beginning_create( + writer_stream); + BT_ASSERT(new_notification); + bt_stream_put_ref(stream); + bt_stream_put_ref(writer_stream); break; } case BT_NOTIFICATION_TYPE_STREAM_END: { - struct bt_ctf_stream *stream = + const bt_stream *stream = bt_notification_stream_end_get_stream(notification); - struct bt_ctf_stream *writer_stream; + const bt_stream *writer_stream; if (!stream) { goto end; } writer_stream = debug_info_stream_end(debug_it, stream); - assert(writer_stream); + BT_ASSERT(writer_stream); new_notification = bt_notification_stream_end_create( writer_stream); - assert(new_notification); - bt_put(stream); - bt_put(writer_stream); + BT_ASSERT(new_notification); + bt_stream_put_ref(stream); + bt_stream_put_ref(writer_stream); break; } default: - puts("Unhandled notification type"); + new_notification = bt_notification_get_ref(notification); + break; } end: @@ -218,26 +220,26 @@ end: } static -struct bt_notification_iterator_next_return debug_info_iterator_next( - struct bt_private_notification_iterator *iterator) +bt_notification_iterator_next_method_return debug_info_iterator_next( + bt_self_notification_iterator *iterator) { struct debug_info_iterator *debug_it = NULL; - struct bt_private_component *component = NULL; + bt_self_component *component = NULL; struct debug_info_component *debug_info = NULL; - struct bt_notification_iterator *source_it = NULL; - struct bt_notification *notification; - struct bt_notification_iterator_next_return ret = { + bt_notification_iterator *source_it = NULL; + const bt_notification *notification; + bt_notification_iterator_next_method_return ret = { .status = BT_NOTIFICATION_ITERATOR_STATUS_OK, .notification = NULL, }; - debug_it = bt_private_notification_iterator_get_user_data(iterator); - assert(debug_it); + debug_it = bt_self_notification_iterator_get_user_data(iterator); + BT_ASSERT(debug_it); - component = bt_private_notification_iterator_get_private_component(iterator); - assert(component); - debug_info = bt_private_component_get_user_data(component); - assert(debug_info); + component = bt_self_notification_iterator_get_private_component(iterator); + BT_ASSERT(component); + debug_info = bt_self_component_get_user_data(component); + BT_ASSERT(debug_info); source_it = debug_it->input_iterator; @@ -255,125 +257,97 @@ struct bt_notification_iterator_next_return debug_info_iterator_next( ret.notification = handle_notification(debug_info->err, debug_it, notification); - assert(ret.notification); - bt_put(notification); + BT_ASSERT(ret.notification); + bt_notification_put_ref(notification); end: - bt_put(component); + bt_object_put_ref(component); return ret; } -/* -static -struct bt_notification *debug_info_iterator_get( - struct bt_private_notification_iterator *iterator) -{ - struct debug_info_iterator *debug_it; - - debug_it = bt_private_notification_iterator_get_user_data(iterator); - assert(debug_it); - - if (!debug_it->current_notification) { - enum bt_notification_iterator_status it_ret; - - it_ret = debug_info_iterator_next(iterator); - if (it_ret) { - goto end; - } - } - -end: - return bt_get(debug_it->current_notification); -} -*/ - static enum bt_notification_iterator_status debug_info_iterator_init( - struct bt_private_notification_iterator *iterator, + bt_self_notification_iterator *iterator, struct bt_private_port *port) { enum bt_notification_iterator_status ret = BT_NOTIFICATION_ITERATOR_STATUS_OK; enum bt_notification_iterator_status it_ret; - struct bt_private_port *input_port = NULL; + enum bt_connection_status conn_status; struct bt_private_connection *connection = NULL; - struct bt_private_component *component = - bt_private_notification_iterator_get_private_component(iterator); + bt_self_component *component = + bt_self_notification_iterator_get_private_component(iterator); struct debug_info_iterator *it_data = g_new0(struct debug_info_iterator, 1); + struct bt_private_port *input_port; if (!it_data) { ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM; goto end; } - /* Create a new iterator on the upstream component. */ - input_port = bt_private_component_filter_get_input_private_port_by_name( - component, "in"); - assert(input_port); - connection = bt_private_port_get_private_connection(input_port); - assert(connection); + input_port = bt_self_component_filter_get_input_port_by_name( + component, "in"); + if (!input_port) { + ret = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; + goto end; + } - it_data->input_iterator = bt_private_connection_create_notification_iterator( - connection, NULL); - if (!it_data->input_iterator) { - ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM; + connection = bt_private_port_get_connection(input_port); + bt_object_put_ref(input_port); + if (!connection) { + ret = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; + goto end; + } + + conn_status = bt_private_connection_create_notification_iterator( + connection, &it_data->input_iterator); + if (conn_status != BT_CONNECTION_STATUS_OK) { + ret = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; goto end; } - it_data->debug_info_component = (struct debug_info_component *) - bt_private_component_get_user_data(component); + it_data->debug_info_component = (struct debug_info_component *) + bt_self_component_get_user_data(component); it_data->err = it_data->debug_info_component->err; it_data->trace_map = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) unref_trace); - it_data->stream_map = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) unref_stream); - it_data->stream_class_map = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) unref_stream_class); - it_data->packet_map = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) unref_packet); - it_data->trace_debug_map = g_hash_table_new_full(g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) unref_debug_info); - - it_ret = bt_private_notification_iterator_set_user_data(iterator, it_data); + + it_ret = bt_self_notification_iterator_set_user_data(iterator, it_data); if (it_ret) { goto end; } end: - bt_put(connection); - bt_put(input_port); + bt_object_put_ref(connection); + bt_object_put_ref(component); return ret; } static enum bt_component_status init_from_params( struct debug_info_component *debug_info_component, - struct bt_value *params) + bt_value *params) { - struct bt_value *value = NULL; + bt_value *value = NULL; enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - assert(params); + BT_ASSERT(params); value = bt_value_map_get(params, "debug-info-field-name"); if (value) { enum bt_value_status value_ret; const char *tmp; - value_ret = bt_value_string_get(value, &tmp); - if (value_ret) { - ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve debug-info-field-name value. " - "Expecting a string"); - } + tmp = bt_value_string_get(value); strcpy(debug_info_component->arg_debug_info_field_name, tmp); - bt_put(value); + bt_value_put_ref(value); } else { debug_info_component->arg_debug_info_field_name = malloc(strlen("debug_info") + 1); if (!debug_info_component->arg_debug_info_field_name) { ret = BT_COMPONENT_STATUS_NOMEM; - printf_error(); + BT_LOGE_STR("Missing field name."); + goto end; } sprintf(debug_info_component->arg_debug_info_field_name, "debug_info"); @@ -382,19 +356,13 @@ enum bt_component_status init_from_params( goto end; } - value = bt_value_map_get(params, "debug-dir"); + value = bt_value_map_get(params, "debug-info-dir"); if (value) { enum bt_value_status value_ret; - value_ret = bt_value_string_get(value, - &debug_info_component->arg_debug_dir); - if (value_ret) { - ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve debug-dir value. " - "Expecting a string"); - } + debug_info_component->arg_debug_dir = bt_value_string_get(value); } - bt_put(value); + bt_value_put_ref(value); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } @@ -403,15 +371,9 @@ enum bt_component_status init_from_params( if (value) { enum bt_value_status value_ret; - value_ret = bt_value_string_get(value, - &debug_info_component->arg_target_prefix); - if (value_ret) { - ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve target-prefix value. " - "Expecting a string"); - } + debug_info_component->arg_target_prefix = bt_value_string_get(value); } - bt_put(value); + bt_value_put_ref(value); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } @@ -419,16 +381,13 @@ enum bt_component_status init_from_params( value = bt_value_map_get(params, "full-path"); if (value) { enum bt_value_status value_ret; + bt_bool bool_val; - value_ret = bt_value_bool_get(value, - &debug_info_component->arg_full_path); - if (value_ret) { - ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve full-path value. " - "Expecting a boolean"); - } + bool_val = bt_value_bool_get(value); + + debug_info_component->arg_full_path = bool_val; } - bt_put(value); + bt_value_put_ref(value); if (ret != BT_COMPONENT_STATUS_OK) { goto end; } @@ -438,7 +397,7 @@ end: } enum bt_component_status debug_info_component_init( - struct bt_private_component *component, struct bt_value *params, + bt_self_component *component, bt_value *params, UNUSED_VAR void *init_method_data) { enum bt_component_status ret; @@ -449,11 +408,23 @@ enum bt_component_status debug_info_component_init( goto end; } - ret = bt_private_component_set_user_data(component, debug_info); + ret = bt_self_component_set_user_data(component, debug_info); if (ret != BT_COMPONENT_STATUS_OK) { goto error; } + ret = bt_self_component_filter_add_input_port( + component, "in", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + + ret = bt_self_component_filter_add_output_port( + component, "out", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + ret = init_from_params(debug_info, params); end: return ret; @@ -462,6 +433,10 @@ error: return ret; } +#ifndef BT_BUILT_IN_PLUGINS +BT_PLUGIN_MODULE(); +#endif + /* Initialize plug-in entry points. */ BT_PLUGIN_WITH_ID(lttng_utils, "lttng-utils"); BT_PLUGIN_DESCRIPTION_WITH_ID(lttng_utils, "LTTng utilities");