X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fconditions%2Fcondition.c;h=18b756dce4c489e2a88f8ef318c366c03c41ce2e;hb=ca806b0b247f89c62ac628a7779ae84049a8c2d7;hp=97598f24963cf8aff6c48f06d868b7a32e722554;hpb=8dbb86b8a981917165030d3a7fbbc2cb932888ed;p=lttng-tools.git diff --git a/src/common/conditions/condition.c b/src/common/conditions/condition.c index 97598f249..18b756dce 100644 --- a/src/common/conditions/condition.c +++ b/src/common/conditions/condition.c @@ -5,17 +5,18 @@ * */ -#include +#include +#include +#include +#include +#include #include +#include #include #include #include -#include -#include -#include -#include +#include #include -#include enum lttng_condition_type lttng_condition_get_type( const struct lttng_condition *condition) @@ -36,25 +37,22 @@ static void condition_destroy_ref(struct urcu_ref *ref) condition->destroy(condition); } -LTTNG_HIDDEN void lttng_condition_get(struct lttng_condition *condition) { urcu_ref_get(&condition->ref); } -LTTNG_HIDDEN void lttng_condition_put(struct lttng_condition *condition) { if (!condition) { return; } - assert(condition->destroy); + LTTNG_ASSERT(condition->destroy); urcu_ref_put(&condition->ref, condition_destroy_ref); } -LTTNG_HIDDEN bool lttng_condition_validate(const struct lttng_condition *condition) { bool valid; @@ -75,7 +73,6 @@ end: return valid; } -LTTNG_HIDDEN int lttng_condition_serialize(const struct lttng_condition *condition, struct lttng_payload *payload) { @@ -103,7 +100,6 @@ end: return ret; } -LTTNG_HIDDEN bool lttng_condition_is_equal(const struct lttng_condition *a, const struct lttng_condition *b) { @@ -127,7 +123,6 @@ end: return is_equal; } -LTTNG_HIDDEN ssize_t lttng_condition_create_from_payload( struct lttng_payload_view *view, struct lttng_condition **condition) @@ -201,7 +196,6 @@ end: return ret; } -LTTNG_HIDDEN void lttng_condition_init(struct lttng_condition *condition, enum lttng_condition_type type) { @@ -209,7 +203,6 @@ void lttng_condition_init(struct lttng_condition *condition, urcu_ref_init(&condition->ref); } -LTTNG_HIDDEN const char *lttng_condition_type_str(enum lttng_condition_type type) { switch (type) { @@ -232,9 +225,66 @@ const char *lttng_condition_type_str(enum lttng_condition_type type) return "session rotation completed"; case LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES: - return "event rule hit"; + return "event rule matches"; default: return "???"; } } + +enum lttng_error_code lttng_condition_mi_serialize( + const struct lttng_trigger *trigger, + const struct lttng_condition *condition, + struct mi_writer *writer, + const struct mi_lttng_error_query_callbacks *error_query_callbacks) +{ + int ret; + enum lttng_error_code ret_code; + struct lttng_error_query_results *error_query_results = NULL; + + LTTNG_ASSERT(condition); + LTTNG_ASSERT(writer); + LTTNG_ASSERT(condition->mi_serialize); + + /* Open condition element. */ + ret = mi_lttng_writer_open_element(writer, mi_lttng_element_condition); + if (ret) { + goto mi_error; + } + + /* Serialize underlying condition. */ + ret_code = condition->mi_serialize(condition, writer); + if (ret_code != LTTNG_OK) { + goto end; + } + + /* Serialize error query results for the action. */ + if (error_query_callbacks && error_query_callbacks->action_cb) { + ret_code = error_query_callbacks->condition_cb( + trigger, &error_query_results); + if (ret_code != LTTNG_OK) { + goto end; + } + + ret_code = lttng_error_query_results_mi_serialize( + error_query_results, writer); + if (ret_code != LTTNG_OK) { + goto end; + } + } + + /* Close condition element. */ + 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_error_query_results_destroy(error_query_results); + return ret_code; +}