X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcli%2Fbabeltrace2.c;h=8301fba870d676097e90a7f51427bcd97ef6c997;hb=76b6c2f71a485f0cc9b766e1a54b9f7330ccd907;hp=eec3486a648a197e3528267c3976b31e7ef098d1;hpb=743138a3cca9770e8fae3f1399df20d087b378f2;p=babeltrace.git diff --git a/src/cli/babeltrace2.c b/src/cli/babeltrace2.c index eec3486a..8301fba8 100644 --- a/src/cli/babeltrace2.c +++ b/src/cli/babeltrace2.c @@ -55,10 +55,8 @@ 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; +/* Application's interrupter (owned by this) */ +static bt_interrupter *the_interrupter; #ifdef __MINGW32__ @@ -66,12 +64,10 @@ static bool canceled = false; 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; - return TRUE; } @@ -92,15 +88,9 @@ void signal_handler(int signum) return; } - if (the_graph) { - bt_graph_cancel(the_graph); - } - - if (the_query_executor) { - bt_query_executor_cancel(the_query_executor); + if (the_interrupter) { + bt_interrupter_set(the_interrupter); } - - canceled = true; } static @@ -120,26 +110,6 @@ void set_signal_handler(void) #endif /* __MINGW32__ */ -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, @@ -147,30 +117,23 @@ 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; - } - - if (canceled) { - BT_CLI_LOGW_APPEND_CAUSE( - "Canceled 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"; + query_exec = bt_query_executor_create(); + if (!query_exec) { + BT_CLI_LOGE_APPEND_CAUSE("Cannot create a query executor."); goto error; } + bt_query_executor_add_interrupter(query_exec, the_interrupter); + 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: @@ -179,38 +142,39 @@ 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"; - goto error; - 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"; + case BT_QUERY_EXECUTOR_QUERY_STATUS_UNKNOWN_OBJECT: + *fail_reason = "unknown query object"; goto error; case BT_QUERY_EXECUTOR_QUERY_STATUS_MEMORY_ERROR: *fail_reason = "not enough memory"; @@ -231,7 +195,7 @@ error: ret = -1; end: - destroy_the_query_executor(); + bt_query_executor_put_ref(query_exec); bt_value_put_ref(result); return ret; } @@ -470,13 +434,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()); @@ -1112,7 +1076,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) { @@ -1120,7 +1084,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) { @@ -1128,7 +1092,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); } @@ -1607,9 +1571,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: " @@ -1829,7 +1790,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; } @@ -1873,7 +1833,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); @@ -1988,8 +1948,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( @@ -2334,9 +2294,9 @@ int cmd_run(struct bt_config *cfg) goto error; } - if (canceled) { + if (bt_interrupter_is_set(the_interrupter)) { BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before creating components."); + "Interrupted by user before creating components."); goto error; } @@ -2348,9 +2308,9 @@ int cmd_run(struct bt_config *cfg) goto error; } - if (canceled) { + if (bt_interrupter_is_set(the_interrupter)) { BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before connecting components."); + "Interrupted by user before connecting components."); goto error; } @@ -2363,12 +2323,6 @@ int cmd_run(struct bt_config *cfg) goto error; } - if (canceled) { - BT_CLI_LOGW_APPEND_CAUSE( - "Canceled by user before running the graph."); - goto error; - } - BT_LOGI_STR("Running the graph."); /* Run the graph */ @@ -2388,13 +2342,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; } @@ -2404,9 +2355,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; } } @@ -2415,6 +2366,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; @@ -2699,7 +2658,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); @@ -2708,6 +2667,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); @@ -2743,6 +2710,7 @@ int main(int argc, const char **argv) end: BT_OBJECT_PUT_REF_AND_RESET(cfg); fini_loaded_plugins(); + bt_interrupter_put_ref(the_interrupter); if (retcode != 0) { print_error_causes();