X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcli%2Fbabeltrace2.c;h=12d9cc0cadfd2154e9626be899c182b346d015a2;hb=1a29b831f3389a6f28a571fca01eee5c750cd86b;hp=0eeb8770d4707d218f141045ce9562c88cc978ad;hpb=2c1d3e9111d8f1b55361b9b880350c2680c90093;p=babeltrace.git diff --git a/src/cli/babeltrace2.c b/src/cli/babeltrace2.c index 0eeb8770..12d9cc0c 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,35 +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"; + 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"; @@ -228,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; } @@ -1604,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: " @@ -1826,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; } @@ -1870,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); @@ -1921,11 +1884,11 @@ int set_stream_intersections(struct cmd_run_ctx *ctx, const bt_component_class *comp_cls = bt_component_class_source_as_component_class_const(src_comp_cls); - ret = query(ctx->cfg, comp_cls, "trace-info", + ret = query(ctx->cfg, comp_cls, "babeltrace.trace-info", cfg_comp->params, &query_result, &fail_reason); if (ret) { - BT_LOGD("Component class does not support the `trace-info` query: %s: " + BT_LOGD("Component class does not support the `babeltrace.trace-info` query: %s: " "comp-class-name=\"%s\"", fail_reason, bt_component_class_get_name(comp_cls)); ret = -1; @@ -1935,7 +1898,7 @@ int set_stream_intersections(struct cmd_run_ctx *ctx, BT_ASSERT(query_result); if (!bt_value_is_array(query_result)) { - BT_LOGD("Unexpected format of \'trace-info\' query result: " + BT_LOGD("Unexpected format of `babeltrace.trace-info` query result: " "component-class-name=%s", bt_component_class_get_name(comp_cls)); ret = -1; @@ -2331,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; } @@ -2345,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; } @@ -2360,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 */ @@ -2385,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; } @@ -2401,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; } } @@ -2412,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; @@ -2705,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); @@ -2740,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();