X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=converter%2Fbabeltrace.c;h=3081f1f074601d4ce96337e04c9215f0193bc0a0;hb=7c7c0433f4507935fbe2adab29d942df22ee8168;hp=34bf2307a7edcee39b7511fd8d98cb52101db1fb;hpb=3696d792f2434ad2b64b76cbe56a6d73399b2952;p=babeltrace.git diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 34bf2307..3081f1f0 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -36,9 +36,14 @@ #include #include #include -#include +#include #include +#include +#include +#include +#include +#include #include #include #include @@ -73,9 +78,16 @@ static char *opt_input_format, *opt_output_format; static GPtrArray *opt_input_paths; static char *opt_output_path; static int opt_stream_intersection; +static char *opt_plugin_path; static struct bt_format *fmt_read; +void bt_dummy_hook(void); +void bt_lttng_live_hook(void); +void bt_ctf_hook(void); +void bt_ctf_text_hook(void); +void bt_ctf_metadata_hook(void); + static void strlower(char *str) { @@ -92,6 +104,7 @@ enum { OPT_OUTPUT_FORMAT, OPT_HELP, OPT_LIST, + OPT_PLUGIN_PATH, OPT_VERBOSE, OPT_DEBUG, OPT_NAMES, @@ -105,11 +118,13 @@ enum { OPT_CLOCK_GMT, OPT_CLOCK_FORCE_CORRELATE, OPT_STREAM_INTERSECTION, - OPT_DEBUG_DIR, + OPT_DEBUG_INFO_DIR, + OPT_DEBUG_INFO_FULL_PATH, + OPT_DEBUG_INFO_TARGET_PREFIX, }; /* - * We are _not_ using POPT_ARG_STRING ability to store directly into + * We are _not_ using POPT_ARG_STRING's ability to store directly into * variables, because we want to cast the return to non-const, which is * not possible without using poptGetOptArg explicitly. This helps us * controlling memory allocation correctly without making assumptions @@ -123,6 +138,7 @@ static struct poptOption long_options[] = { { "output-format", 'o', POPT_ARG_STRING, NULL, OPT_OUTPUT_FORMAT, NULL, NULL }, { "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL }, { "list", 'l', POPT_ARG_NONE, NULL, OPT_LIST, NULL, NULL }, + { "plugin-path", 0, POPT_ARG_STRING, NULL, OPT_PLUGIN_PATH, NULL, NULL }, { "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL }, { "debug", 'd', POPT_ARG_NONE, NULL, OPT_DEBUG, NULL, NULL }, { "names", 'n', POPT_ARG_STRING, NULL, OPT_NAMES, NULL, NULL }, @@ -136,8 +152,10 @@ static struct poptOption long_options[] = { { "clock-gmt", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL }, { "clock-force-correlate", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_FORCE_CORRELATE, NULL, NULL }, { "stream-intersection", 0, POPT_ARG_NONE, NULL, OPT_STREAM_INTERSECTION, NULL, NULL }, -#ifdef ENABLE_DEBUGINFO - { "debug-info-dir", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_DIR, NULL, NULL }, +#ifdef ENABLE_DEBUG_INFO + { "debug-info-dir", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_DIR, NULL, NULL }, + { "debug-info-full-path", 0, POPT_ARG_NONE, NULL, OPT_DEBUG_INFO_FULL_PATH, NULL, NULL }, + { "debug-info-target-prefix", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_TARGET_PREFIX, NULL, NULL }, #endif { NULL, 0, 0, NULL, 0, NULL, NULL }, }; @@ -162,6 +180,7 @@ static void usage(FILE *fp) fprintf(fp, "\n"); fprintf(fp, " -h, --help This help message\n"); fprintf(fp, " -l, --list List available formats\n"); + fprintf(fp, " --plugin-path Supplementary plug-in path\n"); fprintf(fp, " -v, --verbose Verbose mode\n"); fprintf(fp, " (or set BABELTRACE_VERBOSE environment variable)\n"); fprintf(fp, " -d, --debug Debug mode\n"); @@ -185,9 +204,11 @@ static void usage(FILE *fp) fprintf(fp, " --clock-force-correlate Assume that clocks are inherently correlated\n"); fprintf(fp, " across traces.\n"); fprintf(fp, " --stream-intersection Only print events when all streams are active.\n"); -#ifdef ENABLE_DEBUGINFO +#ifdef ENABLE_DEBUG_INFO fprintf(fp, " --debug-info-dir Directory in which to look for debugging information\n"); fprintf(fp, " files. (default: /usr/lib/debug/)\n"); + fprintf(fp, " --debug-info-target-prefix Directory to use as a prefix for executable lookup\n"); + fprintf(fp, " --debug-info-full-path Show full debug info source and binary paths (if available)\n"); #endif list_formats(fp); fprintf(fp, "\n"); @@ -327,6 +348,13 @@ static int parse_options(int argc, char **argv) list_formats(stdout); ret = 1; goto end; + case OPT_PLUGIN_PATH: + opt_plugin_path = (char *) poptGetOptArg(pc); + if (!opt_plugin_path) { + ret = -EINVAL; + goto end; + } ; + break; case OPT_VERBOSE: babeltrace_verbose = 1; break; @@ -411,9 +439,19 @@ static int parse_options(int argc, char **argv) case OPT_STREAM_INTERSECTION: opt_stream_intersection = 1; break; - case OPT_DEBUG_DIR: - opt_debug_dir = (char *) poptGetOptArg(pc); - if (!opt_debug_dir) { + case OPT_DEBUG_INFO_DIR: + opt_debug_info_dir = (char *) poptGetOptArg(pc); + if (!opt_debug_info_dir) { + ret = -EINVAL; + goto end; + } + break; + case OPT_DEBUG_INFO_FULL_PATH: + opt_debug_info_full_path = 1; + break; + case OPT_DEBUG_INFO_TARGET_PREFIX: + opt_debug_info_target_prefix = (char *) poptGetOptArg(pc); + if (!opt_debug_info_target_prefix) { ret = -EINVAL; goto end; } @@ -429,10 +467,6 @@ static int parse_options(int argc, char **argv) if (ipath) g_ptr_array_add(opt_input_paths, (gpointer) ipath); } while (ipath); - if (opt_input_paths->len == 0) { - ret = -EINVAL; - goto end; - } end: if (pc) { @@ -638,41 +672,6 @@ end: return ret; } -static -struct bt_ctf_iter *iter_create_intersect(struct bt_context *ctx, - struct bt_iter_pos **inter_begin_pos, - struct bt_iter_pos **inter_end_pos) -{ - uint64_t begin = 0, end = ULLONG_MAX; - int ret; - - ret = ctf_find_packets_intersection(ctx, &begin, &end); - if (ret == 1) { - fprintf(stderr, "[error] No intersection found between trace files.\n"); - goto error; - } else if (ret != 0) { - goto error; - } - *inter_begin_pos = bt_iter_create_time_pos(NULL, begin); - if (!(*inter_begin_pos)) { - goto error; - } - *inter_end_pos = bt_iter_create_time_pos(NULL, end); - if (!(*inter_end_pos)) { - goto error; - } - - /* - * bt_ctf_iter does not take ownership of begin and end positions, - * so we return them to the caller who must still assume their ownership - * until the iterator is destroyed. - */ - return bt_ctf_iter_create(ctx, *inter_begin_pos, - *inter_end_pos); -error: - return NULL; -} - static int convert_trace(struct bt_trace_descriptor *td_write, struct bt_context *ctx) @@ -691,7 +690,7 @@ int convert_trace(struct bt_trace_descriptor *td_write, } if (opt_stream_intersection) { - iter = iter_create_intersect(ctx, &begin_pos, &end_pos); + iter = bt_ctf_iter_create_intersect(ctx, &begin_pos, &end_pos); } else { begin_pos = bt_iter_create_time_pos(NULL, 0); begin_pos->type = BT_SEEK_BEGIN; @@ -722,14 +721,91 @@ error_iter: return ret; } +static +const char *component_type_str(enum bt_component_type type) +{ + switch (type) { + case BT_COMPONENT_TYPE_SOURCE: + return "source"; + case BT_COMPONENT_TYPE_SINK: + return "sink"; + case BT_COMPONENT_TYPE_FILTER: + return "filter"; + case BT_COMPONENT_TYPE_UNKNOWN: + default: + return "unknown"; + } +} + +static +void print_detected_component_classes(struct bt_component_factory *factory) +{ + int count, i; + + if (!babeltrace_verbose) { + return; + } + + count = bt_component_factory_get_component_class_count(factory); + if (count <= 0) { + fprintf(stderr, "No component classes found. Please make sure your plug-in search path is set correctly."); + return; + } + + printf_verbose("Found %d component classes.\n", count); + for (i = 0; i < count; i++) { + struct bt_component_class *component_class = + bt_component_factory_get_component_class_index( + factory, i); + struct bt_plugin *plugin = bt_component_class_get_plugin( + component_class); + const char *plugin_name = bt_plugin_get_name(plugin); + const char *component_name = bt_component_class_get_name( + component_class); + const char *path = bt_plugin_get_path(plugin); + const char *author = bt_plugin_get_author(plugin); + const char *license = bt_plugin_get_license(plugin); + const char *plugin_description = bt_plugin_get_description( + plugin); + const char *component_description = + bt_component_class_get_description( + component_class); + enum bt_component_type type = bt_component_class_get_type( + component_class); + + printf_verbose("[%s - %s (%s)]\n", plugin_name, component_name, + component_type_str(type)); + printf_verbose("\tpath: %s\n", path); + printf_verbose("\tauthor: %s\n", author); + printf_verbose("\tlicense: %s\n", license); + printf_verbose("\tplugin description: %s\n", + plugin_description ? plugin_description : "None"); + printf_verbose("\tcomponent description: %s\n", + component_description ? component_description : "None"); + } +} + +static +void test_sink_notifications(struct bt_component *sink) +{ + return; +} + int main(int argc, char **argv) { int ret, partial_error = 0, open_success = 0; struct bt_format *fmt_write; struct bt_trace_descriptor *td_write; struct bt_context *ctx; + struct bt_component_factory *component_factory = NULL; + struct bt_component_class *source_class = NULL; + struct bt_component_class *sink_class = NULL; + struct bt_component *source = NULL, *sink = NULL; + struct bt_value *source_params = NULL, *sink_params = NULL; int i; + call_plugins_hooks(); + opt_input_paths = g_ptr_array_new(); ret = parse_options(argc, argv); @@ -745,6 +821,51 @@ int main(int argc, char **argv) printf_verbose("Verbose mode active.\n"); printf_debug("Debug mode active.\n"); + if (!opt_plugin_path) { + fprintf(stderr, "No plugin path specified, aborting...\n"); + ret = -1; + goto end; + } + printf_verbose("Looking-up plugins at %s\n", + opt_plugin_path ? opt_plugin_path : "Invalid"); + component_factory = bt_component_factory_create(); + if (!component_factory) { + fprintf(stderr, "Failed to create component factory.\n"); + ret = -1; + goto end; + } + + ret = bt_component_factory_load(component_factory, opt_plugin_path); + if (ret) { + fprintf(stderr, "Failed to load plugins.\n"); + goto end; + } + + print_detected_component_classes(component_factory); + + sink_class = bt_component_factory_get_component_class(component_factory, + NULL, BT_COMPONENT_TYPE_SINK, "text"); + if (!sink_class) { + fprintf(stderr, "Could not find text output component class. Aborting...\n"); + ret = -1; + goto end; + } + + sink = bt_component_create(sink_class, "bt_text_output", sink_params); + if (!sink) { + fprintf(stderr, "Failed to instanciate text output. Aborting...\n"); + ret = -1; + goto end; + } + + test_sink_notifications(sink); + goto end; + + if (opt_input_paths->len == 0) { + ret = -1; + goto end; + } + if (opt_input_format) strlower(opt_input_format); if (opt_output_format) @@ -872,8 +993,17 @@ end: free(opt_input_format); free(opt_output_format); free(opt_output_path); - free(opt_debug_dir); + free(opt_debug_info_dir); + free(opt_debug_info_target_prefix); g_ptr_array_free(opt_input_paths, TRUE); + BT_PUT(component_factory); + BT_PUT(sink_class); + BT_PUT(source_class); + BT_PUT(source); + BT_PUT(sink); + BT_PUT(source_params); + BT_PUT(sink_params); + if (partial_error) exit(EXIT_FAILURE); else