X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=inline;f=src%2Fcommon%2Fconditions%2Fsession-rotation.c;h=e2a5adf2d40b74ba2b784b1c4e37ae7758073d7e;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=7df5ebab0d8daf97324fccdc0dfb55715ae01da5;hpb=ae20d1bd206b317393846accdc45082d7c37b571;p=lttng-tools.git diff --git a/src/common/conditions/session-rotation.c b/src/common/conditions/session-rotation.c index 7df5ebab0..e2a5adf2d 100644 --- a/src/common/conditions/session-rotation.c +++ b/src/common/conditions/session-rotation.c @@ -5,12 +5,12 @@ * */ +#include +#include +#include #include #include #include -#include -#include -#include #include static @@ -27,6 +27,11 @@ static void lttng_condition_session_rotation_destroy( struct lttng_condition *condition); +static +enum lttng_error_code lttng_condition_session_rotation_mi_serialize( + const struct lttng_condition *condition, + struct mi_writer *writer); + static const struct lttng_condition rotation_condition_template = { /* .type omitted; shall be set on creation. */ @@ -34,6 +39,7 @@ struct lttng_condition rotation_condition_template = { .serialize = lttng_condition_session_rotation_serialize, .equal = lttng_condition_session_rotation_is_equal, .destroy = lttng_condition_session_rotation_destroy, + .mi_serialize = lttng_condition_session_rotation_mi_serialize, }; static @@ -337,6 +343,9 @@ struct lttng_evaluation *lttng_evaluation_session_rotation_create( sizeof(evaluation->parent)); lttng_evaluation_init(&evaluation->parent, type); evaluation->id = id; + if (location) { + lttng_trace_archive_location_get(location); + } evaluation->location = location; return &evaluation->parent; } @@ -383,11 +392,12 @@ ssize_t create_evaluation_from_payload( goto error; } + lttng_trace_archive_location_put(location); ret = size; *_evaluation = evaluation; return ret; error: - lttng_trace_archive_location_destroy(location); + lttng_trace_archive_location_put(location); evaluation = NULL; return -1; } @@ -543,7 +553,7 @@ void lttng_evaluation_session_rotation_destroy( rotation = container_of(evaluation, struct lttng_evaluation_session_rotation, parent); - lttng_trace_archive_location_destroy(rotation->location); + lttng_trace_archive_location_put(rotation->location); free(rotation); } @@ -566,6 +576,12 @@ end: return status; } +/* + * The public API assumes that trace archive locations are always provided as + * "constant". This means that the user of liblttng-ctl never has to destroy a + * trace archive location. Hence, users of liblttng-ctl have no visibility of + * the reference counting of archive locations. + */ enum lttng_evaluation_status lttng_evaluation_session_rotation_completed_get_location( const struct lttng_evaluation *evaluation, @@ -586,3 +602,65 @@ lttng_evaluation_session_rotation_completed_get_location( end: return status; } + +static +enum lttng_error_code lttng_condition_session_rotation_mi_serialize( + const struct lttng_condition *condition, + struct mi_writer *writer) +{ + int ret; + enum lttng_error_code ret_code; + enum lttng_condition_status status; + const char *session_name = NULL; + const char *type_element_str = NULL; + + LTTNG_ASSERT(condition); + LTTNG_ASSERT(writer); + LTTNG_ASSERT(is_rotation_condition(condition)); + + switch (lttng_condition_get_type(condition)) { + case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED: + type_element_str = + mi_lttng_element_condition_session_rotation_completed; + break; + case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING: + type_element_str = + mi_lttng_element_condition_session_rotation_ongoing; + break; + default: + abort(); + break; + } + + status = lttng_condition_session_rotation_get_session_name( + condition, &session_name); + LTTNG_ASSERT(status == LTTNG_CONDITION_STATUS_OK); + LTTNG_ASSERT(session_name); + + /* Open condition session rotation_* element. */ + ret = mi_lttng_writer_open_element(writer, type_element_str); + if (ret) { + goto mi_error; + } + + /* Session name. */ + ret = mi_lttng_writer_write_element_string( + writer, mi_lttng_element_session_name, session_name); + if (ret) { + goto mi_error; + } + + /* Close condition session rotation 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; +}