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__
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;
}
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
#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,
{
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:
{
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";
- goto error;
case BT_QUERY_EXECUTOR_QUERY_STATUS_MEMORY_ERROR:
*fail_reason = "not enough memory";
goto error;
ret = -1;
end:
- destroy_the_query_executor();
+ bt_query_executor_put_ref(query_exec);
bt_value_put_ref(result);
return ret;
}
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: "
}
BT_GRAPH_PUT_REF_AND_RESET(ctx->graph);
- the_graph = NULL;
ctx->cfg = NULL;
}
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);
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;
}
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;
}
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 */
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;
}
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;
}
}
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;
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);
}
}
+ 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);
end:
BT_OBJECT_PUT_REF_AND_RESET(cfg);
fini_loaded_plugins();
+ bt_interrupter_put_ref(the_interrupter);
if (retcode != 0) {
print_error_causes();