X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Ferror-query.c;h=d6bca73b7ae5696aaf307254503ed91da667384a;hb=3afa94aeca5a0daae40fd7b6cc96b7e4c150c7d8;hp=38f47c224da98d67c45c28a9019dab19cfadfcb2;hpb=63dd3d7b5b0979c4b11a6bb8d0e4155120482977;p=lttng-tools.git diff --git a/src/common/error-query.c b/src/common/error-query.c index 38f47c224..d6bca73b7 100644 --- a/src/common/error-query.c +++ b/src/common/error-query.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -85,6 +86,15 @@ struct lttng_error_query_results { struct lttng_dynamic_pointer_array results; }; +static +enum lttng_error_code lttng_error_query_result_mi_serialize( + const struct lttng_error_query_result *result, + struct mi_writer *writer); + +static +enum lttng_error_code lttng_error_query_result_counter_mi_serialize( + const struct lttng_error_query_result *result, + struct mi_writer *writer); struct lttng_error_query *lttng_error_query_trigger_create( const struct lttng_trigger *trigger) @@ -254,7 +264,7 @@ int lttng_error_query_result_counter_serialize( { const struct lttng_error_query_result_counter *counter_result; - assert(result->type == LTTNG_ERROR_QUERY_RESULT_TYPE_COUNTER); + LTTNG_ASSERT(result->type == LTTNG_ERROR_QUERY_RESULT_TYPE_COUNTER); counter_result = container_of(result, typeof(*counter_result), parent); return lttng_dynamic_buffer_append(&payload->buffer, @@ -264,7 +274,6 @@ int lttng_error_query_result_counter_serialize( sizeof(struct lttng_error_query_result_counter_comm)); } -LTTNG_HIDDEN int lttng_error_query_result_serialize( const struct lttng_error_query_result *result, struct lttng_payload *payload) @@ -327,8 +336,8 @@ int lttng_error_query_result_init( { int ret; - assert(name); - assert(description); + LTTNG_ASSERT(name); + LTTNG_ASSERT(description); result->type = result_type; @@ -351,7 +360,6 @@ end: return ret; } -LTTNG_HIDDEN void lttng_error_query_result_destroy(struct lttng_error_query_result *counter) { if (!counter) { @@ -371,7 +379,6 @@ void lttng_error_query_result_destroy(struct lttng_error_query_result *counter) free(counter); } -LTTNG_HIDDEN struct lttng_error_query_result * lttng_error_query_result_counter_create( const char *name, const char *description, uint64_t value) @@ -408,7 +415,6 @@ void destroy_result(void *ptr) lttng_error_query_result_destroy(result); } -LTTNG_HIDDEN struct lttng_error_query_results *lttng_error_query_results_create(void) { struct lttng_error_query_results *set = zmalloc(sizeof(*set)); @@ -423,7 +429,6 @@ end: return set; } -LTTNG_HIDDEN int lttng_error_query_results_add_result( struct lttng_error_query_results *results, struct lttng_error_query_result *result) @@ -432,7 +437,6 @@ int lttng_error_query_results_add_result( &results->results, result); } -LTTNG_HIDDEN ssize_t lttng_error_query_result_create_from_payload( struct lttng_payload_view *view, struct lttng_error_query_result **result) @@ -521,7 +525,6 @@ end: return used_size; } -LTTNG_HIDDEN int lttng_error_query_results_serialize( const struct lttng_error_query_results *results, struct lttng_payload *payload) @@ -558,7 +561,6 @@ end: return ret; } -LTTNG_HIDDEN ssize_t lttng_error_query_results_create_from_payload( struct lttng_payload_view *view, struct lttng_error_query_results **_results) @@ -691,14 +693,12 @@ end: return ret; } -LTTNG_HIDDEN enum lttng_error_query_target_type lttng_error_query_get_target_type( const struct lttng_error_query *query) { return query->target_type; } -LTTNG_HIDDEN const struct lttng_trigger *lttng_error_query_trigger_borrow_target( const struct lttng_error_query *query) { @@ -708,7 +708,6 @@ const struct lttng_trigger *lttng_error_query_trigger_borrow_target( return query_trigger->trigger; } -LTTNG_HIDDEN const struct lttng_trigger *lttng_error_query_condition_borrow_target( const struct lttng_error_query *query) { @@ -718,7 +717,6 @@ const struct lttng_trigger *lttng_error_query_condition_borrow_target( return query_trigger->trigger; } -LTTNG_HIDDEN const struct lttng_trigger *lttng_error_query_action_borrow_trigger_target( const struct lttng_error_query *query) { @@ -728,7 +726,6 @@ const struct lttng_trigger *lttng_error_query_action_borrow_trigger_target( return query_action->trigger; } -LTTNG_HIDDEN struct lttng_action *lttng_error_query_action_borrow_action_target( const struct lttng_error_query *query, struct lttng_trigger *trigger) @@ -740,12 +737,11 @@ struct lttng_action *lttng_error_query_action_borrow_action_target( trigger, &query_action->action_path); } -LTTNG_HIDDEN int lttng_error_query_serialize(const struct lttng_error_query *query, struct lttng_payload *payload) { int ret; - struct lttng_error_query_comm header = { + const struct lttng_error_query_comm header = { .target_type = (typeof(header.target_type)) query->target_type, }; @@ -785,7 +781,6 @@ end: return ret; } -LTTNG_HIDDEN ssize_t lttng_error_query_create_from_payload(struct lttng_payload_view *view, struct lttng_error_query **query) { @@ -972,7 +967,7 @@ lttng_error_query_results_get_result( *result = (typeof(*result)) lttng_dynamic_pointer_array_get_pointer( &results->results, index); - assert(*result); + LTTNG_ASSERT(*result); status = LTTNG_ERROR_QUERY_RESULTS_STATUS_OK; end: return status; @@ -1049,3 +1044,175 @@ enum lttng_error_query_result_status lttng_error_query_result_counter_get_value( end: return status; } + +static +enum lttng_error_code lttng_error_query_result_counter_mi_serialize( + const struct lttng_error_query_result *result, + struct mi_writer *writer) +{ + int ret; + enum lttng_error_code ret_code; + enum lttng_error_query_result_status status; + uint64_t value; + + LTTNG_ASSERT(result); + LTTNG_ASSERT(writer); + + status = lttng_error_query_result_counter_get_value(result, &value); + LTTNG_ASSERT(status == LTTNG_ERROR_QUERY_RESULT_STATUS_OK); + + /* Open error query result counter element. */ + ret = mi_lttng_writer_open_element( + writer, mi_lttng_element_error_query_result_counter); + if (ret) { + goto mi_error; + } + + /* Value. */ + ret = mi_lttng_writer_write_element_unsigned_int(writer, + mi_lttng_element_error_query_result_counter_value, + value); + if (ret) { + goto mi_error; + } + + /* Close error query result counter 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: + return ret_code; +} + +static +enum lttng_error_code lttng_error_query_result_mi_serialize( + const struct lttng_error_query_result *result, + struct mi_writer *writer) +{ + int ret; + enum lttng_error_code ret_code; + enum lttng_error_query_result_status result_status; + enum lttng_error_query_result_type type; + const char *name = NULL; + const char *description = NULL; + + LTTNG_ASSERT(result); + LTTNG_ASSERT(writer); + + type = lttng_error_query_result_get_type(result); + + result_status = lttng_error_query_result_get_name(result, &name); + LTTNG_ASSERT(result_status == LTTNG_ERROR_QUERY_RESULT_STATUS_OK); + + result_status = lttng_error_query_result_get_description( + result, &description); + LTTNG_ASSERT(result_status == LTTNG_ERROR_QUERY_RESULT_STATUS_OK); + + /* Open error query result element. */ + ret = mi_lttng_writer_open_element( + writer, mi_lttng_element_error_query_result); + if (ret) { + goto mi_error; + } + + /* Name. */ + ret = mi_lttng_writer_write_element_string( + writer, mi_lttng_element_error_query_result_name, name); + if (ret) { + goto mi_error; + } + + /* Description. */ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_error_query_result_description, + description); + if (ret) { + goto mi_error; + } + + /* Serialize the result according to its sub type. */ + switch (type) { + case LTTNG_ERROR_QUERY_RESULT_TYPE_COUNTER: + ret_code = lttng_error_query_result_counter_mi_serialize( + result, writer); + break; + default: + abort(); + } + + if (ret_code != LTTNG_OK) { + goto end; + } + + /* Close error query result 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: + return ret_code; +} + +enum lttng_error_code lttng_error_query_results_mi_serialize( + const struct lttng_error_query_results *results, + struct mi_writer *writer) +{ + int ret; + enum lttng_error_code ret_code; + unsigned int i, count; + enum lttng_error_query_results_status results_status; + + LTTNG_ASSERT(results); + LTTNG_ASSERT(writer); + + /* Open error query results element. */ + ret = mi_lttng_writer_open_element( + writer, mi_lttng_element_error_query_results); + if (ret) { + goto mi_error; + } + + results_status = lttng_error_query_results_get_count(results, &count); + LTTNG_ASSERT(results_status == LTTNG_ERROR_QUERY_RESULTS_STATUS_OK); + + for (i = 0; i < count; i++) { + const struct lttng_error_query_result *result; + + results_status = lttng_error_query_results_get_result( + results, &result, i); + LTTNG_ASSERT(results_status == LTTNG_ERROR_QUERY_RESULTS_STATUS_OK); + + /* A single error query result. */ + ret_code = lttng_error_query_result_mi_serialize(result, writer); + if (ret_code != LTTNG_OK) { + goto end; + } + } + + /* Close error query results. */ + 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: + return ret_code; +}