X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Fcli%2Fbabeltrace2.c;h=9699b0c3b5e46fba695fbbf6d4614df0f413f559;hp=cbbc9bd2d3dec07c5662f33c95fe1ee54d7ba633;hb=9b4f9b425f2efce9a6ccc25f7ae062ebc1116a7d;hpb=770538dd64bcd8f258cb059c438f845533900a27 diff --git a/src/cli/babeltrace2.c b/src/cli/babeltrace2.c index cbbc9bd2..9699b0c3 100644 --- a/src/cli/babeltrace2.c +++ b/src/cli/babeltrace2.c @@ -39,6 +39,7 @@ #include "babeltrace2-cfg.h" #include "babeltrace2-cfg-cli-args.h" #include "babeltrace2-cfg-cli-args-default.h" +#include "babeltrace2-plugins.h" #define ENV_BABELTRACE_WARN_COMMAND_NAME_DIRECTORY_CLASH "BABELTRACE_CLI_WARN_COMMAND_NAME_DIRECTORY_CLASH" #define ENV_BABELTRACE_CLI_LOG_LEVEL "BABELTRACE_CLI_LOG_LEVEL" @@ -54,12 +55,9 @@ static const char* log_level_env_var_names[] = { NULL, }; -/* Application's processing graph (weak) */ -static bt_graph *the_graph; -static bt_query_executor *the_query_executor; -static bool canceled = false; - -GPtrArray *loaded_plugins; +/* Application's interrupter (owned by this) */ +static bt_interrupter *the_interrupter; +static volatile bool interrupted = false; #ifdef __MINGW32__ @@ -67,12 +65,11 @@ GPtrArray *loaded_plugins; static BOOL WINAPI signal_handler(DWORD signal) { - if (the_graph) { - bt_graph_cancel(the_graph); + if (the_interrupter) { + bt_interrupter_set(the_interrupter); } - canceled = true; - + interrupted = true; return TRUE; } @@ -93,15 +90,11 @@ void signal_handler(int signum) return; } - if (the_graph) { - bt_graph_cancel(the_graph); + if (the_interrupter) { + bt_interrupter_set(the_interrupter); } - if (the_query_executor) { - bt_query_executor_cancel(the_query_executor); - } - - canceled = true; + interrupted = true; } static @@ -121,39 +114,6 @@ void set_signal_handler(void) #endif /* __MINGW32__ */ -static -void init_static_data(void) -{ - loaded_plugins = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_object_put_ref); -} - -static -void fini_static_data(void) -{ - g_ptr_array_free(loaded_plugins, TRUE); -} - -static -int create_the_query_executor(void) -{ - int ret = 0; - - the_query_executor = bt_query_executor_create(); - if (!the_query_executor) { - BT_CLI_LOGE_APPEND_CAUSE("Cannot create a query executor."); - ret = -1; - } - - return ret; -} - -static -void destroy_the_query_executor(void) -{ - BT_QUERY_EXECUTOR_PUT_REF_AND_RESET(the_query_executor); -} - static int query(struct bt_config *cfg, const bt_component_class *comp_cls, const char *obj, const bt_value *params, @@ -161,30 +121,33 @@ int query(struct bt_config *cfg, const bt_component_class *comp_cls, { const bt_value *result = NULL; bt_query_executor_query_status query_status; + bt_query_executor *query_exec; *fail_reason = "unknown error"; int ret = 0; BT_ASSERT(fail_reason); BT_ASSERT(user_result); - ret = create_the_query_executor(); - if (ret) { - /* create_the_query_executor() logs errors */ - goto end; + query_exec = bt_query_executor_create(); + if (!query_exec) { + BT_CLI_LOGE_APPEND_CAUSE("Cannot create a query executor."); + goto error; } - if (canceled) { + bt_query_executor_add_interrupter(query_exec, the_interrupter); + + if (interrupted) { BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before executing the query: " + "Interrupted by user before executing the query: " "comp-cls-addr=%p, comp-cls-name=\"%s\", " "query-obj=\"%s\"", comp_cls, bt_component_class_get_name(comp_cls), obj); - *fail_reason = "canceled by user"; + *fail_reason = "interrupted by user"; goto error; } while (true) { query_status = bt_query_executor_query( - the_query_executor, comp_cls, obj, params, + query_exec, comp_cls, obj, params, cfg->log_level, &result); switch (query_status) { case BT_QUERY_EXECUTOR_QUERY_STATUS_OK: @@ -193,29 +156,36 @@ int query(struct bt_config *cfg, const bt_component_class *comp_cls, { const uint64_t sleep_time_us = 100000; + if (bt_interrupter_is_set(the_interrupter)) { + *fail_reason = "interrupted by user"; + goto error; + } + /* Wait 100 ms and retry */ BT_LOGD("Got BT_QUERY_EXECUTOR_QUERY_STATUS_AGAIN: sleeping: " "time-us=%" PRIu64, sleep_time_us); if (usleep(sleep_time_us)) { - if (bt_query_executor_is_canceled(the_query_executor)) { + if (bt_interrupter_is_set(the_interrupter)) { BT_CLI_LOGW_APPEND_CAUSE( - "Query was canceled by user: " + "Query was interrupted by user: " "comp-cls-addr=%p, comp-cls-name=\"%s\", " "query-obj=\"%s\"", comp_cls, bt_component_class_get_name(comp_cls), obj); - *fail_reason = "canceled by user"; + *fail_reason = "interrupted by user"; goto error; } } continue; } - case BT_QUERY_EXECUTOR_QUERY_STATUS_CANCELED: - *fail_reason = "canceled by user"; - goto error; case BT_QUERY_EXECUTOR_QUERY_STATUS_ERROR: + if (bt_interrupter_is_set(the_interrupter)) { + *fail_reason = "interrupted by user"; + goto error; + } + goto error; case BT_QUERY_EXECUTOR_QUERY_STATUS_INVALID_OBJECT: *fail_reason = "invalid or unknown query object"; @@ -223,9 +193,6 @@ int query(struct bt_config *cfg, const bt_component_class *comp_cls, case BT_QUERY_EXECUTOR_QUERY_STATUS_INVALID_PARAMS: *fail_reason = "invalid query parameters"; goto error; - case BT_QUERY_EXECUTOR_QUERY_STATUS_UNSUPPORTED: - *fail_reason = "unsupported action"; - goto error; case BT_QUERY_EXECUTOR_QUERY_STATUS_MEMORY_ERROR: *fail_reason = "not enough memory"; goto error; @@ -245,40 +212,12 @@ error: ret = -1; end: - destroy_the_query_executor(); + bt_query_executor_put_ref(query_exec); bt_value_put_ref(result); return ret; } -static -const bt_plugin *find_plugin(const char *name) -{ - int i; - const bt_plugin *plugin = NULL; - - BT_ASSERT(name); - BT_LOGI("Finding plugin: name=\"%s\"", name); - - for (i = 0; i < loaded_plugins->len; i++) { - plugin = g_ptr_array_index(loaded_plugins, i); - - if (strcmp(name, bt_plugin_get_name(plugin)) == 0) { - break; - } - plugin = NULL; - } - - if (plugin) { - BT_LOGI("Found plugin: name=\"%s\", plugin-addr=%p", - name, plugin); - } else { - BT_LOGI("Cannot find plugin: name=\"%s\"", name); - } - - bt_plugin_get_ref(plugin); - return plugin; -} typedef const void *(*plugin_borrow_comp_cls_func_t)( const bt_plugin *, const char *); @@ -294,7 +233,7 @@ const void *find_component_class_from_plugin(const char *plugin_name, BT_LOGI("Finding component class: plugin-name=\"%s\", " "comp-cls-name=\"%s\"", plugin_name, comp_class_name); - plugin = find_plugin(plugin_name); + plugin = find_loaded_plugin(plugin_name); if (!plugin) { goto end; } @@ -512,13 +451,13 @@ void print_value_rec(FILE *fp, const bt_value *value, size_t indent) bt_common_color_reset()); break; case BT_VALUE_TYPE_UNSIGNED_INTEGER: - uint_val = bt_value_unsigned_integer_get(value); + uint_val = bt_value_integer_unsigned_get(value); fprintf(fp, "%s%s%" PRIu64 "%s\n", bt_common_color_bold(), bt_common_color_fg_red(), uint_val, bt_common_color_reset()); break; case BT_VALUE_TYPE_SIGNED_INTEGER: - int_val = bt_value_signed_integer_get(value); + int_val = bt_value_integer_signed_get(value); fprintf(fp, "%s%s%" PRId64 "%s\n", bt_common_color_bold(), bt_common_color_fg_red(), int_val, bt_common_color_reset()); @@ -757,151 +696,6 @@ void print_cfg(struct bt_config *cfg) } } -static -void add_to_loaded_plugins(const bt_plugin_set *plugin_set) -{ - int64_t i; - int64_t count; - - count = bt_plugin_set_get_plugin_count(plugin_set); - BT_ASSERT(count >= 0); - - for (i = 0; i < count; i++) { - const bt_plugin *plugin = - bt_plugin_set_borrow_plugin_by_index_const(plugin_set, i); - const bt_plugin *loaded_plugin = - find_plugin(bt_plugin_get_name(plugin)); - - BT_ASSERT(plugin); - - if (loaded_plugin) { - BT_LOGI("Not using plugin: another one already exists with the same name: " - "plugin-name=\"%s\", plugin-path=\"%s\", " - "existing-plugin-path=\"%s\"", - bt_plugin_get_name(plugin), - bt_plugin_get_path(plugin), - bt_plugin_get_path(loaded_plugin)); - bt_plugin_put_ref(loaded_plugin); - } else { - /* Add to global array. */ - BT_LOGD("Adding plugin to loaded plugins: plugin-path=\"%s\"", - bt_plugin_get_name(plugin)); - bt_plugin_get_ref(plugin); - g_ptr_array_add(loaded_plugins, (void *) plugin); - } - } -} - -static -int load_dynamic_plugins(const bt_value *plugin_paths) -{ - int nr_paths, i, ret = 0; - - nr_paths = bt_value_array_get_size(plugin_paths); - if (nr_paths < 0) { - BT_CLI_LOGE_APPEND_CAUSE( - "Cannot load dynamic plugins: no plugin path."); - ret = -1; - goto end; - } - - BT_LOGI_STR("Loading dynamic plugins."); - - for (i = 0; i < nr_paths; i++) { - const bt_value *plugin_path_value = NULL; - const char *plugin_path; - const bt_plugin_set *plugin_set = NULL; - bt_plugin_find_all_from_dir_status status; - - plugin_path_value = - bt_value_array_borrow_element_by_index_const( - plugin_paths, i); - plugin_path = bt_value_string_get(plugin_path_value); - - /* - * Skip this if the directory does not exist because - * bt_plugin_find_all_from_dir() expects an existing - * directory. - */ - if (!g_file_test(plugin_path, G_FILE_TEST_IS_DIR)) { - BT_LOGI("Skipping nonexistent directory path: " - "path=\"%s\"", plugin_path); - continue; - } - - status = bt_plugin_find_all_from_dir(plugin_path, BT_FALSE, - BT_FALSE, &plugin_set); - if (status < 0) { - BT_CLI_LOGE_APPEND_CAUSE( - "Unable to load dynamic plugins from directory: " - "path=\"%s\"", plugin_path); - ret = -1; - goto end; - } else if (status == - BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND) { - BT_LOGI("No plugins found in directory: path=\"%s\"", - plugin_path); - continue; - } - - BT_ASSERT(status == BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_OK); - BT_ASSERT(plugin_set); - add_to_loaded_plugins(plugin_set); - bt_plugin_set_put_ref(plugin_set); - } -end: - return ret; -} - -static -int load_static_plugins(void) -{ - int ret = 0; - const bt_plugin_set *plugin_set; - bt_plugin_find_all_from_static_status status; - - BT_LOGI("Loading static plugins."); - status = bt_plugin_find_all_from_static(BT_FALSE, &plugin_set); - if (status < 0) { - BT_CLI_LOGE_APPEND_CAUSE("Unable to load static plugins."); - ret = -1; - goto end; - } else if (status == - BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND) { - BT_LOGI("No static plugins found."); - goto end; - } - - BT_ASSERT(status == BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_OK); - BT_ASSERT(plugin_set); - add_to_loaded_plugins(plugin_set); - bt_plugin_set_put_ref(plugin_set); - -end: - return ret; -} - -static -int load_all_plugins(const bt_value *plugin_paths) -{ - int ret = 0; - - if (load_dynamic_plugins(plugin_paths)) { - ret = -1; - goto end; - } - - if (load_static_plugins()) { - ret = -1; - goto end; - } - - BT_LOGI("Loaded all plugins: count=%u", loaded_plugins->len); - -end: - return ret; -} - static void print_plugin_info(const bt_plugin *plugin) { @@ -1034,7 +828,7 @@ int cmd_help(struct bt_config *cfg) const bt_plugin *plugin = NULL; const bt_component_class *needed_comp_cls = NULL; - plugin = find_plugin(cfg->cmd_data.help.cfg_component->plugin_name->str); + plugin = find_loaded_plugin(cfg->cmd_data.help.cfg_component->plugin_name->str); if (!plugin) { BT_CLI_LOGE_APPEND_CAUSE( "Cannot find plugin: plugin-name=\"%s\"", @@ -1149,14 +943,14 @@ int cmd_list_plugins(struct bt_config *cfg) printf("From the following plugin paths:\n\n"); print_value(stdout, cfg->plugin_paths, 2); printf("\n"); - plugins_count = loaded_plugins->len; + plugins_count = get_loaded_plugins_count(); if (plugins_count == 0) { printf("No plugins found.\n"); goto end; } for (i = 0; i < plugins_count; i++) { - const bt_plugin *plugin = g_ptr_array_index(loaded_plugins, i); + const bt_plugin *plugin = borrow_loaded_plugin(i); component_classes_count += bt_plugin_get_source_component_class_count(plugin) + @@ -1173,7 +967,7 @@ int cmd_list_plugins(struct bt_config *cfg) bt_common_color_reset()); for (i = 0; i < plugins_count; i++) { - const bt_plugin *plugin = g_ptr_array_index(loaded_plugins, i); + const bt_plugin *plugin = borrow_loaded_plugin(i); printf("\n"); print_plugin_info(plugin); @@ -1299,7 +1093,7 @@ int cmd_print_lttng_live_sessions(struct bt_config *cfg) BT_CLI_LOGE_APPEND_CAUSE("Missing `timer-us` entry."); goto error; } - timer_us = bt_value_signed_integer_get(v); + timer_us = bt_value_integer_signed_get(v); fprintf(out_stream, " (timer = %" PRIu64 ", ", timer_us); v = bt_value_map_borrow_entry_value_const(map, "stream-count"); if (!v) { @@ -1307,7 +1101,7 @@ int cmd_print_lttng_live_sessions(struct bt_config *cfg) "Missing `stream-count` entry."); goto error; } - streams = bt_value_signed_integer_get(v); + streams = bt_value_integer_signed_get(v); fprintf(out_stream, "%" PRIu64 " stream(s), ", streams); v = bt_value_map_borrow_entry_value_const(map, "client-count"); if (!v) { @@ -1315,7 +1109,7 @@ int cmd_print_lttng_live_sessions(struct bt_config *cfg) "Missing `client-count` entry."); goto error; } - clients = bt_value_signed_integer_get(v); + clients = bt_value_integer_signed_get(v); fprintf(out_stream, "%" PRIu64 " client(s) connected)\n", clients); } @@ -1483,8 +1277,8 @@ gboolean port_id_equal(gconstpointer v1, gconstpointer v2) const struct port_id *id1 = v1; const struct port_id *id2 = v2; - return !strcmp(id1->instance_name, id2->instance_name) && - !strcmp(id1->port_name, id2->port_name); + return strcmp(id1->instance_name, id2->instance_name) == 0 && + strcmp(id1->port_name, id2->port_name) == 0; } static @@ -1794,9 +1588,6 @@ int cmd_run_ctx_connect_upstream_port_to_downstream_component( switch (connect_ports_status) { case BT_GRAPH_CONNECT_PORTS_STATUS_OK: break; - case BT_GRAPH_CONNECT_PORTS_STATUS_CANCELED: - BT_CLI_LOGW_APPEND_CAUSE("Graph was canceled by user."); - break; default: BT_CLI_LOGE_APPEND_CAUSE( "Cannot create connection: graph refuses to connect ports: " @@ -2016,7 +1807,6 @@ void cmd_run_ctx_destroy(struct cmd_run_ctx *ctx) } BT_GRAPH_PUT_REF_AND_RESET(ctx->graph); - the_graph = NULL; ctx->cfg = NULL; } @@ -2060,7 +1850,7 @@ int cmd_run_ctx_init(struct cmd_run_ctx *ctx, struct bt_config *cfg) goto error; } - the_graph = ctx->graph; + bt_graph_add_interrupter(ctx->graph, the_interrupter); add_listener_status = bt_graph_add_source_component_output_port_added_listener( ctx->graph, graph_source_output_port_added_listener, NULL, ctx, NULL); @@ -2175,8 +1965,8 @@ int set_stream_intersections(struct cmd_run_ctx *ctx, goto error; } - begin = bt_value_signed_integer_get(intersection_begin); - end = bt_value_signed_integer_get(intersection_end); + begin = bt_value_integer_signed_get(intersection_begin); + end = bt_value_integer_signed_get(intersection_end); if (begin < 0 || end < 0 || end < begin) { BT_CLI_LOGE_APPEND_CAUSE( @@ -2521,9 +2311,9 @@ int cmd_run(struct bt_config *cfg) goto error; } - if (canceled) { + if (interrupted) { BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before creating components."); + "Interrupted by user before creating components."); goto error; } @@ -2535,9 +2325,9 @@ int cmd_run(struct bt_config *cfg) goto error; } - if (canceled) { + if (interrupted) { BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before connecting components."); + "Interrupted by user before connecting components."); goto error; } @@ -2550,9 +2340,9 @@ int cmd_run(struct bt_config *cfg) goto error; } - if (canceled) { + if (interrupted) { BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before running the graph."); + "Interrupted by user before running the graph."); goto error; } @@ -2575,13 +2365,10 @@ int cmd_run(struct bt_config *cfg) switch (run_status) { case BT_GRAPH_RUN_STATUS_OK: break; - case BT_GRAPH_RUN_STATUS_CANCELED: - BT_CLI_LOGW_APPEND_CAUSE("Graph was canceled by user."); - goto error; case BT_GRAPH_RUN_STATUS_AGAIN: - if (bt_graph_is_canceled(ctx.graph)) { + if (bt_interrupter_is_set(the_interrupter)) { BT_CLI_LOGW_APPEND_CAUSE( - "Graph was canceled by user."); + "Graph was interrupted by user."); goto error; } @@ -2591,9 +2378,9 @@ int cmd_run(struct bt_config *cfg) cfg->cmd_data.run.retry_duration_us); if (usleep(cfg->cmd_data.run.retry_duration_us)) { - if (bt_graph_is_canceled(ctx.graph)) { + if (bt_interrupter_is_set(the_interrupter)) { BT_CLI_LOGW_APPEND_CAUSE( - "Graph was canceled by user."); + "Graph was interrupted by user."); goto error; } } @@ -2602,6 +2389,14 @@ int cmd_run(struct bt_config *cfg) case BT_GRAPH_RUN_STATUS_END: goto end; default: + if (bt_interrupter_is_set(the_interrupter)) { + BT_CLI_LOGW_APPEND_CAUSE( + "Graph was interrupted by user and failed: " + "status=%s", + bt_common_func_status_string(run_status)); + goto error; + } + BT_CLI_LOGE_APPEND_CAUSE( "Graph failed to complete successfully"); goto error; @@ -2859,7 +2654,7 @@ int main(int argc, const char **argv) init_log_level(); set_signal_handler(); - init_static_data(); + init_loaded_plugins(); cfg = bt_config_cli_args_create_with_default(argc, argv, &retcode); if (retcode < 0) { @@ -2886,7 +2681,7 @@ int main(int argc, const char **argv) print_cfg(cfg); if (cfg->command_needs_plugins) { - ret = load_all_plugins(cfg->plugin_paths); + ret = require_loaded_plugins(cfg->plugin_paths); if (ret) { BT_CLI_LOGE_APPEND_CAUSE( "Failed to load plugins: ret=%d", ret); @@ -2895,6 +2690,14 @@ int main(int argc, const char **argv) } } + BT_ASSERT(!the_interrupter); + the_interrupter = bt_interrupter_create(); + if (!the_interrupter) { + BT_CLI_LOGE_APPEND_CAUSE("Failed to create an interrupter object."); + retcode = 1; + goto end; + } + BT_LOGI("Executing command: cmd=%d, command-name=\"%s\"", cfg->command, cfg->command_name); @@ -2929,7 +2732,8 @@ int main(int argc, const char **argv) end: BT_OBJECT_PUT_REF_AND_RESET(cfg); - fini_static_data(); + fini_loaded_plugins(); + bt_interrupter_put_ref(the_interrupter); if (retcode != 0) { print_error_causes();