X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Factions%2Faction.c;h=21dee73fafb3463d8fd53077aee9240f74d03fca;hb=ca806b0b247f;hp=f9236c87811e1d3241b22b6bfbe60117102a4bd8;hpb=ad63a966ae7a204528fa77599f92100d7341be7a;p=lttng-tools.git diff --git a/src/common/actions/action.c b/src/common/actions/action.c index f9236c878..21dee73fa 100644 --- a/src/common/actions/action.c +++ b/src/common/actions/action.c @@ -5,8 +5,8 @@ * */ -#include #include +#include #include #include #include @@ -17,14 +17,13 @@ #include #include -LTTNG_HIDDEN const char *lttng_action_type_string(enum lttng_action_type action_type) { switch (action_type) { case LTTNG_ACTION_TYPE_UNKNOWN: return "UNKNOWN"; - case LTTNG_ACTION_TYPE_GROUP: - return "GROUP"; + case LTTNG_ACTION_TYPE_LIST: + return "LIST"; case LTTNG_ACTION_TYPE_NOTIFY: return "NOTIFY"; case LTTNG_ACTION_TYPE_ROTATE_SESSION: @@ -45,7 +44,6 @@ enum lttng_action_type lttng_action_get_type(const struct lttng_action *action) return action ? action->type : LTTNG_ACTION_TYPE_UNKNOWN; } -LTTNG_HIDDEN void lttng_action_init(struct lttng_action *action, enum lttng_action_type type, action_validate_cb validate, @@ -53,7 +51,8 @@ void lttng_action_init(struct lttng_action *action, action_equal_cb equal, action_destroy_cb destroy, action_get_rate_policy_cb get_rate_policy, - action_add_error_query_results_cb add_error_query_results) + action_add_error_query_results_cb add_error_query_results, + action_mi_serialize_cb mi) { urcu_ref_init(&action->ref); action->type = type; @@ -63,6 +62,7 @@ void lttng_action_init(struct lttng_action *action, action->destroy = destroy; action->get_rate_policy = get_rate_policy; action->add_error_query_results = add_error_query_results; + action->mi_serialize = mi; action->execution_request_counter = 0; action->execution_counter = 0; @@ -78,20 +78,18 @@ void action_destroy_ref(struct urcu_ref *ref) action->destroy(action); } -LTTNG_HIDDEN void lttng_action_get(struct lttng_action *action) { urcu_ref_get(&action->ref); } -LTTNG_HIDDEN void lttng_action_put(struct lttng_action *action) { if (!action) { return; } - assert(action->destroy); + LTTNG_ASSERT(action->destroy); urcu_ref_put(&action->ref, action_destroy_ref); } @@ -100,7 +98,6 @@ void lttng_action_destroy(struct lttng_action *action) lttng_action_put(action); } -LTTNG_HIDDEN bool lttng_action_validate(struct lttng_action *action) { bool valid; @@ -121,7 +118,6 @@ end: return valid; } -LTTNG_HIDDEN int lttng_action_serialize(struct lttng_action *action, struct lttng_payload *payload) { @@ -144,7 +140,6 @@ end: return ret; } -LTTNG_HIDDEN ssize_t lttng_action_create_from_payload(struct lttng_payload_view *view, struct lttng_action **action) { @@ -191,7 +186,7 @@ ssize_t lttng_action_create_from_payload(struct lttng_payload_view *view, create_from_payload_cb = lttng_action_stop_session_create_from_payload; break; - case LTTNG_ACTION_TYPE_GROUP: + case LTTNG_ACTION_TYPE_LIST: create_from_payload_cb = lttng_action_list_create_from_payload; break; default: @@ -219,7 +214,7 @@ ssize_t lttng_action_create_from_payload(struct lttng_payload_view *view, goto end; } - assert(*action); + LTTNG_ASSERT(*action); consumed_len = sizeof(struct lttng_action_comm) + specific_action_consumed_len; @@ -228,7 +223,6 @@ end: return consumed_len; } -LTTNG_HIDDEN bool lttng_action_is_equal(const struct lttng_action *a, const struct lttng_action *b) { @@ -247,31 +241,27 @@ bool lttng_action_is_equal(const struct lttng_action *a, goto end; } - assert(a->equal); + LTTNG_ASSERT(a->equal); is_equal = a->equal(a, b); end: return is_equal; } -LTTNG_HIDDEN void lttng_action_increase_execution_request_count(struct lttng_action *action) { action->execution_request_counter++; } -LTTNG_HIDDEN void lttng_action_increase_execution_count(struct lttng_action *action) { action->execution_counter++; } -LTTNG_HIDDEN void lttng_action_increase_execution_failure_count(struct lttng_action *action) { uatomic_inc(&action->execution_failure_counter); } -LTTNG_HIDDEN bool lttng_action_should_execute(const struct lttng_action *action) { const struct lttng_rate_policy *policy = NULL; @@ -294,7 +284,6 @@ end: return execute; } -LTTNG_HIDDEN enum lttng_action_status lttng_action_add_error_query_results( const struct lttng_action *action, struct lttng_error_query_results *results) @@ -302,7 +291,6 @@ enum lttng_action_status lttng_action_add_error_query_results( return action->add_error_query_results(action, results); } -LTTNG_HIDDEN enum lttng_action_status lttng_action_generic_add_error_query_results( const struct lttng_action *action, struct lttng_error_query_results *results) @@ -334,3 +322,95 @@ end: lttng_error_query_result_destroy(error_counter); return action_status; } + +enum lttng_error_code lttng_action_mi_serialize(const struct lttng_trigger *trigger, + const struct lttng_action *action, + struct mi_writer *writer, + const struct mi_lttng_error_query_callbacks + *error_query_callbacks, + struct lttng_dynamic_array *action_path_indexes) +{ + int ret; + enum lttng_error_code ret_code; + struct lttng_action_path *action_path = NULL; + struct lttng_error_query_results *error_query_results = NULL; + + LTTNG_ASSERT(action); + LTTNG_ASSERT(writer); + + /* Open action. */ + ret = mi_lttng_writer_open_element(writer, mi_lttng_element_action); + if (ret) { + goto mi_error; + } + + if (action->type == LTTNG_ACTION_TYPE_LIST) { + /* + * Recursion is safe since action lists can't be nested for + * the moment. + */ + ret_code = lttng_action_list_mi_serialize(trigger, action, writer, + error_query_callbacks, action_path_indexes); + if (ret_code != LTTNG_OK) { + goto end; + } + + /* Nothing else to do. */ + goto close_action_element; + } + + LTTNG_ASSERT(action->mi_serialize); + ret_code = action->mi_serialize(action, writer); + if (ret_code != LTTNG_OK) { + goto end; + } + + /* Error query for the action. */ + if (error_query_callbacks && error_query_callbacks->action_cb) { + const uint64_t *action_path_indexes_raw_pointer = NULL; + const size_t action_path_indexes_size = + lttng_dynamic_array_get_count( + action_path_indexes); + + if (action_path_indexes_size != 0) { + action_path_indexes_raw_pointer = + (const uint64_t *) action_path_indexes + ->buffer.data; + } + + action_path = lttng_action_path_create( + action_path_indexes_raw_pointer, + action_path_indexes_size); + LTTNG_ASSERT(action_path); + + ret_code = error_query_callbacks->action_cb( + trigger, action_path, &error_query_results); + if (ret_code != LTTNG_OK) { + goto end; + } + + /* Serialize the error query results. */ + ret_code = lttng_error_query_results_mi_serialize( + error_query_results, writer); + if (ret_code != LTTNG_OK) { + goto end; + } + } + +close_action_element: + /* Close action. */ + ret = mi_lttng_writer_close_element(writer); + if (ret) { + goto mi_error; + } + + ret_code = LTTNG_OK; + goto end; + +mi_error: + ret_code = LTTNG_ERR_MI_IO_FAIL; +end: + lttng_action_path_destroy(action_path); + lttng_error_query_results_destroy(error_query_results); + return ret_code; +}