*
*/
+#include <common/error.h>
+#include <common/macros.h>
+#include <common/mi-lttng.h>
#include <lttng/condition/condition-internal.h>
#include <lttng/condition/session-rotation-internal.h>
#include <lttng/location-internal.h>
-#include <common/macros.h>
-#include <common/error.h>
-#include <assert.h>
#include <stdbool.h>
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. */
.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
return ret;
}
-LTTNG_HIDDEN
ssize_t lttng_condition_session_rotation_ongoing_create_from_payload(
struct lttng_payload_view *view,
struct lttng_condition **condition)
LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING);
}
-LTTNG_HIDDEN
ssize_t lttng_condition_session_rotation_completed_create_from_payload(
struct lttng_payload_view *view,
struct lttng_condition **condition)
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;
}
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;
}
return ret;
}
-LTTNG_HIDDEN
ssize_t lttng_evaluation_session_rotation_ongoing_create_from_payload(
struct lttng_payload_view *view,
struct lttng_evaluation **evaluation)
view, evaluation);
}
-LTTNG_HIDDEN
ssize_t lttng_evaluation_session_rotation_completed_create_from_payload(
struct lttng_payload_view *view,
struct lttng_evaluation **evaluation)
view, evaluation);
}
-LTTNG_HIDDEN
struct lttng_evaluation *lttng_evaluation_session_rotation_ongoing_create(
uint64_t id)
{
NULL);
}
-LTTNG_HIDDEN
struct lttng_evaluation *lttng_evaluation_session_rotation_completed_create(
uint64_t id, struct lttng_trace_archive_location *location)
{
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);
}
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,
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;
+}