X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Flib%2Fgraph%2Fquery-executor.c;h=1addeeb302311ddb7ce71c2dc5e114e5d4771ec6;hp=6d5334453b9aff444a06ff2d5a1441041424648d;hb=9b4f9b425f2efce9a6ccc25f7ae062ebc1116a7d;hpb=c2d9d9cf280189e77453e82e4979c307eef111e7 diff --git a/src/lib/graph/query-executor.c b/src/lib/graph/query-executor.c index 6d533445..1addeeb3 100644 --- a/src/lib/graph/query-executor.c +++ b/src/lib/graph/query-executor.c @@ -26,6 +26,7 @@ #include "common/assert.h" #include "common/common.h" #include "lib/assert-pre.h" +#include "lib/assert-post.h" #include #include #include @@ -36,6 +37,8 @@ #include "component-class.h" #include "query-executor.h" +#include "interrupter.h" +#include "lib/func-status.h" static void bt_query_executor_destroy(struct bt_object *obj) @@ -44,6 +47,15 @@ void bt_query_executor_destroy(struct bt_object *obj) container_of(obj, struct bt_query_executor, base); BT_LOGD("Destroying query executor: addr=%p", query_exec); + + if (query_exec->interrupters) { + BT_LOGD_STR("Putting interrupters."); + g_ptr_array_free(query_exec->interrupters, TRUE); + query_exec->interrupters = NULL; + } + + BT_OBJECT_PUT_REF_AND_RESET(query_exec->default_interrupter); + g_free(query_exec); } @@ -54,10 +66,29 @@ struct bt_query_executor *bt_query_executor_create(void) BT_LOGD_STR("Creating query executor."); query_exec = g_new0(struct bt_query_executor, 1); if (!query_exec) { - BT_LOGE_STR("Failed to allocate one query executor."); + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate one query executor."); goto end; } + query_exec->interrupters = g_ptr_array_new_with_free_func( + (GDestroyNotify) bt_object_put_no_null_check); + if (!query_exec->interrupters) { + BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray."); + BT_OBJECT_PUT_REF_AND_RESET(query_exec); + goto end; + } + + query_exec->default_interrupter = bt_interrupter_create(); + if (!query_exec->default_interrupter) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to create one interrupter object."); + BT_OBJECT_PUT_REF_AND_RESET(query_exec); + goto end; + } + + bt_query_executor_add_interrupter(query_exec, + query_exec->default_interrupter); bt_object_init_shared(&query_exec->base, bt_query_executor_destroy); BT_LOGD("Created query executor: addr=%p", query_exec); @@ -66,25 +97,25 @@ end: return (void *) query_exec; } -enum bt_query_executor_status bt_query_executor_query( +enum bt_query_executor_query_status bt_query_executor_query( struct bt_query_executor *query_exec, const struct bt_component_class *comp_cls, const char *object, const struct bt_value *params, - bt_logging_level log_level, + enum bt_logging_level log_level, const struct bt_value **user_result) { - typedef enum bt_query_status (*method_t)(void *, const void *, - const void *, const void *, bt_logging_level, const void *); + typedef enum bt_component_class_query_method_status (*method_t)(void *, + const void *, const void *, const void *, enum bt_logging_level, + const void *); - enum bt_query_status status; - enum bt_query_executor_status exec_status; + enum bt_query_executor_query_status status; + enum bt_component_class_query_method_status query_status; method_t method = NULL; BT_ASSERT_PRE_NON_NULL(query_exec, "Query executor"); BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); BT_ASSERT_PRE_NON_NULL(object, "Object"); BT_ASSERT_PRE_NON_NULL(user_result, "Result (output)"); - BT_ASSERT_PRE(!query_exec->canceled, "Query executor is canceled."); if (!params) { params = bt_value_null; @@ -120,7 +151,7 @@ enum bt_query_executor_status bt_query_executor_query( /* Not an error: nothing to query */ BT_LIB_LOGD("Component class has no registered query method: " "%!+C", comp_cls); - exec_status = BT_QUERY_EXECUTOR_STATUS_UNSUPPORTED; + status = BT_FUNC_STATUS_INVALID_OBJECT; goto end; } @@ -130,36 +161,45 @@ enum bt_query_executor_status bt_query_executor_query( query_exec, comp_cls, object, params, bt_common_logging_level_string(log_level)); *user_result = NULL; - status = method((void *) comp_cls, query_exec, object, params, + query_status = method((void *) comp_cls, query_exec, object, params, log_level, user_result); BT_LIB_LOGD("User method returned: status=%s, %![res-]+v", - bt_query_status_string(status), *user_result); - BT_ASSERT_PRE(status != BT_QUERY_STATUS_OK || *user_result, - "User method returned `BT_QUERY_STATUS_OK` without a result."); - exec_status = (int) status; - if (query_exec->canceled) { - BT_OBJECT_PUT_REF_AND_RESET(*user_result); - exec_status = BT_QUERY_EXECUTOR_STATUS_CANCELED; - goto end; - } + bt_common_func_status_string(query_status), *user_result); + BT_ASSERT_POST(query_status != BT_FUNC_STATUS_OK || *user_result, + "User method returned `BT_FUNC_STATUS_OK` without a result."); + status = (int) query_status; end: - return exec_status; + return status; +} + +enum bt_query_executor_add_interrupter_status bt_query_executor_add_interrupter( + struct bt_query_executor *query_exec, + const struct bt_interrupter *intr) +{ + BT_ASSERT_PRE_NON_NULL(query_exec, "Query executor"); + BT_ASSERT_PRE_NON_NULL(intr, "Interrupter"); + g_ptr_array_add(query_exec->interrupters, (void *) intr); + bt_object_get_no_null_check(intr); + BT_LIB_LOGD("Added interrupter to query executor: " + "query-exec-addr=%p, %![intr-]+z", + query_exec, intr); + return BT_FUNC_STATUS_OK; } -enum bt_query_executor_status bt_query_executor_cancel( - struct bt_query_executor *query_exec) +bt_bool bt_query_executor_is_interrupted(const struct bt_query_executor *query_exec) { BT_ASSERT_PRE_NON_NULL(query_exec, "Query executor"); - query_exec->canceled = BT_TRUE; - BT_LOGI("Canceled query executor: addr=%p", query_exec); - return BT_QUERY_EXECUTOR_STATUS_OK; + return (bt_bool) bt_interrupter_array_any_is_set( + query_exec->interrupters); } -bt_bool bt_query_executor_is_canceled(const struct bt_query_executor *query_exec) +void bt_query_executor_interrupt(struct bt_query_executor *query_exec) { BT_ASSERT_PRE_NON_NULL(query_exec, "Query executor"); - return query_exec->canceled; + bt_interrupter_set(query_exec->default_interrupter); + BT_LIB_LOGI("Interrupted query executor: query-exec-addr=%p", + query_exec); } void bt_query_executor_get_ref(const struct bt_query_executor *query_executor)