#include <common/kernel-ctl/kernel-ctl.h>
#include <common/dynamic-buffer.h>
#include <common/buffer-view.h>
+#include <common/payload.h>
+#include <common/payload-view.h>
#include <common/trace-chunk.h>
#include <lttng/location-internal.h>
#include <lttng/trigger/trigger-internal.h>
return nb_event;
error:
- /* Negate the error code to differentiate the size from an error */
- return -ret;
+ return ret;
}
/*
}
}
+ /*
+ * Open a packet in every stream of the session to ensure that viewers
+ * can correctly identify the boundaries of the periods during which
+ * tracing was active for this session.
+ */
+ ret = session_open_packets(session);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+
/*
* Clear the flag that indicates that a rotation was done while the
* session was stopped.
enum lttng_error_code ret_code;
lttng_dynamic_buffer_init(&payload);
- if (cmd_ctx->lsm->u.create_session.home_dir_size >=
+ if (cmd_ctx->lsm.u.create_session.home_dir_size >=
LTTNG_PATH_MAX) {
ret_code = LTTNG_ERR_INVALID;
goto error;
}
- if (cmd_ctx->lsm->u.create_session.session_descriptor_size >
+ if (cmd_ctx->lsm.u.create_session.session_descriptor_size >
LTTNG_SESSION_DESCRIPTOR_MAX_LEN) {
ret_code = LTTNG_ERR_INVALID;
goto error;
}
- payload_size = cmd_ctx->lsm->u.create_session.home_dir_size +
- cmd_ctx->lsm->u.create_session.session_descriptor_size;
+ payload_size = cmd_ctx->lsm.u.create_session.home_dir_size +
+ cmd_ctx->lsm.u.create_session.session_descriptor_size;
ret = lttng_dynamic_buffer_set_size(&payload, payload_size);
if (ret) {
ret_code = LTTNG_ERR_NOMEM;
home_dir_view = lttng_buffer_view_from_dynamic_buffer(
&payload,
0,
- cmd_ctx->lsm->u.create_session.home_dir_size);
+ cmd_ctx->lsm.u.create_session.home_dir_size);
session_descriptor_view = lttng_buffer_view_from_dynamic_buffer(
&payload,
- cmd_ctx->lsm->u.create_session.home_dir_size,
- cmd_ctx->lsm->u.create_session.session_descriptor_size);
+ cmd_ctx->lsm.u.create_session.home_dir_size,
+ cmd_ctx->lsm.u.create_session.session_descriptor_size);
ret = lttng_session_descriptor_create_from_buffer(
&session_descriptor_view, &session_descriptor);
*/
ret = cmd_rotate_session(session, NULL, true,
LTTNG_TRACE_CHUNK_COMMAND_TYPE_NO_OPERATION);
- if (ret != LTTNG_OK) {
+ /*
+ * Rotation operations may not be supported by the kernel
+ * tracer. Hence, do not consider this implicit rotation as
+ * a session destruction error. The library has already stopped
+ * the session and waited for pending data; there is nothing
+ * left to do but complete the destruction of the session.
+ */
+ if (ret != LTTNG_OK &&
+ ret != -LTTNG_ERR_ROTATION_NOT_AVAILABLE_KERNEL) {
ERR("Failed to perform a quiet rotation as part of the destruction of session \"%s\": %s",
- session->name, lttng_strerror(-ret));
+ session->name, lttng_strerror(ret));
destruction_last_error = -ret;
}
}
size_t trigger_len;
ssize_t sock_recv_len;
struct lttng_trigger *trigger = NULL;
- struct lttng_buffer_view view;
- struct lttng_dynamic_buffer trigger_buffer;
+ struct lttng_payload trigger_payload;
- lttng_dynamic_buffer_init(&trigger_buffer);
- trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
- ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
+ lttng_payload_init(&trigger_payload);
+ trigger_len = (size_t) cmd_ctx->lsm.u.trigger.length;
+ ret = lttng_dynamic_buffer_set_size(
+ &trigger_payload.buffer, trigger_len);
if (ret) {
ret = LTTNG_ERR_NOMEM;
goto end;
}
- sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
- trigger_len);
+ sock_recv_len = lttcomm_recv_unix_sock(
+ sock, trigger_payload.buffer.data, trigger_len);
if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
ERR("Failed to receive \"register trigger\" command payload");
/* TODO: should this be a new error enum ? */
goto end;
}
- view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
- if (lttng_trigger_create_from_buffer(&view, &trigger) !=
- trigger_len) {
- ERR("Invalid trigger payload received in \"register trigger\" command");
- ret = LTTNG_ERR_INVALID_TRIGGER;
- goto end;
+ {
+ struct lttng_payload_view view =
+ lttng_payload_view_from_payload(
+ &trigger_payload, 0, -1);
+
+ if (lttng_trigger_create_from_payload(&view, &trigger) !=
+ trigger_len) {
+ ERR("Invalid trigger payload received in \"register trigger\" command");
+ ret = LTTNG_ERR_INVALID_TRIGGER;
+ goto end;
+ }
}
ret = notification_thread_command_register_trigger(notification_thread,
trigger = NULL;
end:
lttng_trigger_destroy(trigger);
- lttng_dynamic_buffer_reset(&trigger_buffer);
+ lttng_payload_reset(&trigger_payload);
return ret;
}
size_t trigger_len;
ssize_t sock_recv_len;
struct lttng_trigger *trigger = NULL;
- struct lttng_buffer_view view;
- struct lttng_dynamic_buffer trigger_buffer;
+ struct lttng_payload trigger_payload;
- lttng_dynamic_buffer_init(&trigger_buffer);
- trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
- ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
+ lttng_payload_init(&trigger_payload);
+ trigger_len = (size_t) cmd_ctx->lsm.u.trigger.length;
+ ret = lttng_dynamic_buffer_set_size(
+ &trigger_payload.buffer, trigger_len);
if (ret) {
ret = LTTNG_ERR_NOMEM;
goto end;
}
- sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
- trigger_len);
+ sock_recv_len = lttcomm_recv_unix_sock(
+ sock, trigger_payload.buffer.data, trigger_len);
if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
ERR("Failed to receive \"unregister trigger\" command payload");
/* TODO: should this be a new error enum ? */
goto end;
}
- view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
- if (lttng_trigger_create_from_buffer(&view, &trigger) !=
- trigger_len) {
- ERR("Invalid trigger payload received in \"unregister trigger\" command");
- ret = LTTNG_ERR_INVALID_TRIGGER;
- goto end;
+ {
+ struct lttng_payload_view view =
+ lttng_payload_view_from_payload(
+ &trigger_payload, 0, -1);
+
+ if (lttng_trigger_create_from_payload(&view, &trigger) !=
+ trigger_len) {
+ ERR("Invalid trigger payload received in \"unregister trigger\" command");
+ ret = LTTNG_ERR_INVALID_TRIGGER;
+ goto end;
+ }
}
ret = notification_thread_command_unregister_trigger(notification_thread,
trigger);
end:
lttng_trigger_destroy(trigger);
- lttng_dynamic_buffer_reset(&trigger_buffer);
+ lttng_payload_reset(&trigger_payload);
return ret;
}