X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Flttng-utils%2Fplugin.c;h=d27f6728385f444468ea4e6780cb172e50c7c1a6;hb=be3c4e36fab9415c72a000036e37442406a02702;hp=1db6355b5d5e22c49f91718176a7f4a05e86d771;hpb=779fc95da417a699e4b7264edb2022c56df5dfd6;p=babeltrace.git diff --git a/plugins/lttng-utils/plugin.c b/plugins/lttng-utils/plugin.c index 1db6355b..d27f6728 100644 --- a/plugins/lttng-utils/plugin.c +++ b/plugins/lttng-utils/plugin.c @@ -26,8 +26,12 @@ * SOFTWARE. */ +#define BT_LOG_TAG "PLUGIN-CTF-LTTNG-UTILS-DEBUG-INFO-FLT" +#include "logging.h" + #include #include +#include #include #include #include @@ -43,6 +47,17 @@ #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) { @@ -73,33 +88,10 @@ end: } static -void unref_debug_info(struct debug_info *debug_info) +void unref_trace(struct debug_info_trace *di_trace) { - 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) -{ - bt_put(packet); -} - -static -void unref_stream_class(struct bt_ctf_stream_class *stream_class) -{ - bt_put(stream_class); + bt_put(di_trace->writer_trace); + g_free(di_trace); } static @@ -113,13 +105,14 @@ void debug_info_iterator_destroy(struct bt_private_notification_iterator *it) if (it_data->input_iterator_group) { g_ptr_array_free(it_data->input_iterator_group, TRUE); } + + g_hash_table_foreach_remove(it_data->trace_map, + empty_trace_map, it_data); + g_hash_table_destroy(it_data->trace_map); + bt_put(it_data->current_notification); bt_put(it_data->input_iterator); - 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); + g_free(it_data); } @@ -147,6 +140,7 @@ struct bt_notification *handle_notification(FILE *err, writer_packet); assert(new_notification); bt_put(packet); + bt_put(writer_packet); break; } case BT_NOTIFICATION_TYPE_PACKET_END: @@ -190,6 +184,25 @@ struct bt_notification *handle_notification(FILE *err, bt_put(writer_event); break; } + case BT_NOTIFICATION_TYPE_STREAM_BEGIN: + { + struct bt_ctf_stream *stream = + bt_notification_stream_begin_get_stream(notification); + struct bt_ctf_stream *writer_stream; + + if (!stream) { + goto end; + } + + writer_stream = debug_info_stream_begin(debug_it, stream); + assert(writer_stream); + new_notification = bt_notification_stream_begin_create( + writer_stream); + assert(new_notification); + bt_put(stream); + bt_put(writer_stream); + break; + } case BT_NOTIFICATION_TYPE_STREAM_END: { struct bt_ctf_stream *stream = @@ -268,30 +281,6 @@ end: 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, @@ -300,6 +289,7 @@ enum bt_notification_iterator_status debug_info_iterator_init( enum bt_notification_iterator_status ret = BT_NOTIFICATION_ITERATOR_STATUS_OK; enum bt_notification_iterator_status it_ret; + 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); @@ -307,6 +297,7 @@ enum bt_notification_iterator_status debug_info_iterator_init( struct bt_private_port *input_port; static const enum bt_notification_type notif_types[] = { BT_NOTIFICATION_TYPE_EVENT, + BT_NOTIFICATION_TYPE_STREAM_BEGIN, BT_NOTIFICATION_TYPE_STREAM_END, BT_NOTIFICATION_TYPE_PACKET_BEGIN, BT_NOTIFICATION_TYPE_PACKET_END, @@ -332,10 +323,10 @@ enum bt_notification_iterator_status debug_info_iterator_init( goto end; } - it_data->input_iterator = bt_private_connection_create_notification_iterator( - connection, notif_types); - if (!it_data->input_iterator) { - ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM; + conn_status = bt_private_connection_create_notification_iterator( + connection, notif_types, &it_data->input_iterator); + if (conn_status != BT_CONNECTION_STATUS_OK) { + ret = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; goto end; } @@ -344,14 +335,6 @@ enum bt_notification_iterator_status debug_info_iterator_init( 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); if (it_ret) { @@ -382,7 +365,7 @@ enum bt_component_status init_from_params( 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. " + BT_LOGE_STR("Failed to retrieve debug-info-field-name value. " "Expecting a string"); } strcpy(debug_info_component->arg_debug_info_field_name, tmp); @@ -392,7 +375,7 @@ enum bt_component_status init_from_params( 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."); } sprintf(debug_info_component->arg_debug_info_field_name, "debug_info"); @@ -409,7 +392,7 @@ enum bt_component_status init_from_params( &debug_info_component->arg_debug_dir); if (value_ret) { ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve debug-dir value. " + BT_LOGE_STR("Failed to retrieve debug-dir value. " "Expecting a string"); } } @@ -426,7 +409,7 @@ enum bt_component_status init_from_params( &debug_info_component->arg_target_prefix); if (value_ret) { ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve target-prefix value. " + BT_LOGE_STR("Failed to retrieve target-prefix value. " "Expecting a string"); } } @@ -444,7 +427,7 @@ enum bt_component_status init_from_params( &bool_val); if (value_ret) { ret = BT_COMPONENT_STATUS_INVALID; - printf_error("Failed to retrieve full-path value. " + BT_LOGE_STR("Failed to retrieve full-path value. " "Expecting a boolean"); } @@ -465,7 +448,6 @@ enum bt_component_status debug_info_component_init( { enum bt_component_status ret; struct debug_info_component *debug_info = create_debug_info_component_data(); - struct bt_private_port *priv_port = NULL; if (!debug_info) { ret = BT_COMPONENT_STATUS_NOMEM; @@ -477,21 +459,17 @@ enum bt_component_status debug_info_component_init( goto error; } - priv_port = bt_private_component_filter_add_input_private_port( - component, "in", NULL); - if (!priv_port) { - ret = BT_COMPONENT_STATUS_ERROR; + ret = bt_private_component_filter_add_input_private_port( + component, "in", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { goto end; } - BT_PUT(priv_port); - priv_port = bt_private_component_filter_add_output_private_port( - component, "out", NULL); - if (!priv_port) { - ret = BT_COMPONENT_STATUS_ERROR; + ret = bt_private_component_filter_add_output_private_port( + component, "out", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { goto end; } - BT_PUT(priv_port); ret = init_from_params(debug_info, params); end: @@ -501,6 +479,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");