#include <urcu/list.h> /* URCU list library (-lurcu) */
#include <lttng/lttng.h>
+#include "context.h"
#include "liblttsessiondcomm.h"
#include "ltt-sessiond.h"
#include "lttngerr.h"
switch (cmd_ctx->lsm->cmd_type) {
case LTTNG_CREATE_SESSION:
case LTTNG_LIST_SESSIONS:
- case LTTNG_KERNEL_LIST_EVENTS:
+ case LTTNG_LIST_TRACEPOINTS:
break;
default:
DBG("Getting session %s by name", cmd_ctx->lsm->session_name);
* Check kernel command for kernel session.
*/
switch (cmd_ctx->lsm->cmd_type) {
- case LTTNG_KERNEL_ADD_CONTEXT:
+ case LTTNG_ADD_CONTEXT:
case LTTNG_KERNEL_DISABLE_ALL_EVENT:
case LTTNG_KERNEL_DISABLE_CHANNEL:
case LTTNG_KERNEL_DISABLE_EVENT:
case LTTNG_KERNEL_ENABLE_ALL_EVENT:
case LTTNG_KERNEL_ENABLE_CHANNEL:
case LTTNG_KERNEL_ENABLE_EVENT:
- case LTTNG_KERNEL_LIST_EVENTS:
+ case LTTNG_LIST_TRACEPOINTS:
/* Kernel tracer check */
if (kernel_tracer_fd == 0) {
init_kernel_tracer();
}
/* Need a session for kernel command */
- if (cmd_ctx->lsm->cmd_type != LTTNG_KERNEL_LIST_EVENTS &&
+ if (cmd_ctx->lsm->cmd_type != LTTNG_LIST_TRACEPOINTS &&
cmd_ctx->session->kernel_session == NULL) {
ret = create_kernel_session(cmd_ctx->session);
/* Process by command type */
switch (cmd_ctx->lsm->cmd_type) {
- case LTTNG_KERNEL_ADD_CONTEXT:
+ case LTTNG_ADD_CONTEXT:
{
- int found = 0, no_event = 0;
- struct ltt_kernel_channel *chan;
- struct ltt_kernel_event *event;
- struct lttng_kernel_context ctx;
+ struct lttng_kernel_context kctx;
/* Setup lttng message with no payload */
ret = setup_lttng_msg(cmd_ctx, 0);
goto setup_error;
}
- /* Check if event name is given */
- if (strlen(cmd_ctx->lsm->u.context.event_name) == 0) {
- no_event = 1;
- }
-
- /* Create Kernel context */
- ctx.ctx = cmd_ctx->lsm->u.context.ctx.ctx;
- ctx.u.perf_counter.type = cmd_ctx->lsm->u.context.ctx.u.perf_counter.type;
- ctx.u.perf_counter.config = cmd_ctx->lsm->u.context.ctx.u.perf_counter.config;
- strncpy(ctx.u.perf_counter.name,
- cmd_ctx->lsm->u.context.ctx.u.perf_counter.name,
- sizeof(ctx.u.perf_counter.name));
-
- if (strlen(cmd_ctx->lsm->u.context.channel_name) == 0) {
- /* Go over all channels */
- DBG("Adding context to all channels");
- cds_list_for_each_entry(chan,
- &cmd_ctx->session->kernel_session->channel_list.head, list) {
- if (no_event) {
- ret = kernel_add_channel_context(chan, &ctx);
- if (ret < 0) {
- ret = LTTCOMM_KERN_CONTEXT_FAIL;
- goto error;
- }
- } else {
- event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan);
- if (event != NULL) {
- ret = kernel_add_event_context(event, &ctx);
- if (ret < 0) {
- ret = LTTCOMM_KERN_CONTEXT_FAIL;
- goto error;
- }
- found = 1;
- break;
- }
- }
- }
- } else {
- chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.context.channel_name,
- cmd_ctx->session->kernel_session);
- if (chan == NULL) {
- ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
+ switch (cmd_ctx->lsm->domain.type) {
+ case LTTNG_DOMAIN_KERNEL:
+ /* Create Kernel context */
+ kctx.ctx = cmd_ctx->lsm->u.context.ctx.ctx;
+ kctx.u.perf_counter.type = cmd_ctx->lsm->u.context.ctx.u.perf_counter.type;
+ kctx.u.perf_counter.config = cmd_ctx->lsm->u.context.ctx.u.perf_counter.config;
+ strncpy(kctx.u.perf_counter.name,
+ cmd_ctx->lsm->u.context.ctx.u.perf_counter.name,
+ LTTNG_SYMBOL_NAME_LEN);
+
+ /* Add kernel context to kernel tracer. See context.c */
+ ret = add_kernel_context(cmd_ctx->session->kernel_session, &kctx,
+ cmd_ctx->lsm->u.context.event_name,
+ cmd_ctx->lsm->u.context.channel_name);
+ if (ret != LTTCOMM_OK) {
goto error;
}
-
- if (no_event) {
- ret = kernel_add_channel_context(chan, &ctx);
- if (ret < 0) {
- ret = LTTCOMM_KERN_CONTEXT_FAIL;
- goto error;
- }
- } else {
- event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan);
- if (event != NULL) {
- ret = kernel_add_event_context(event, &ctx);
- if (ret < 0) {
- ret = LTTCOMM_KERN_CONTEXT_FAIL;
- goto error;
- }
- }
- }
- }
-
- if (!found && !no_event) {
- ret = LTTCOMM_NO_EVENT;
- goto error;
+ break;
+ default:
+ /* TODO: Userspace tracing */
+ ret = LTTCOMM_NOT_IMPLEMENTED;
}
ret = LTTCOMM_OK;
ret = LTTCOMM_OK;
break;
}
- case LTTNG_KERNEL_LIST_EVENTS:
+ case LTTNG_LIST_TRACEPOINTS:
{
struct lttng_event *events;
- ssize_t size = 0;
-
- DBG("Listing kernel events");
-
- size = kernel_list_events(kernel_tracer_fd, &events);
- if (size < 0) {
- ret = LTTCOMM_KERN_LIST_FAIL;
- goto error;
+ ssize_t nb_events = 0;
+
+ switch (cmd_ctx->lsm->domain.type) {
+ case LTTNG_DOMAIN_KERNEL:
+ DBG("Listing kernel events");
+ nb_events = kernel_list_events(kernel_tracer_fd, &events);
+ if (nb_events < 0) {
+ ret = LTTCOMM_KERN_LIST_FAIL;
+ goto error;
+ }
+ break;
+ default:
+ /* TODO: Userspace listing */
+ ret = LTTCOMM_NOT_IMPLEMENTED;
+ break;
}
/*
* Setup lttng message with payload size set to the event list size in
* bytes and then copy list into the llm payload.
*/
- ret = setup_lttng_msg(cmd_ctx, sizeof(struct lttng_event) * size);
+ ret = setup_lttng_msg(cmd_ctx, sizeof(struct lttng_event) * nb_events);
if (ret < 0) {
+ free(events);
goto setup_error;
}
/* Copy event list into message payload */
memcpy(cmd_ctx->llm->payload, events,
- sizeof(struct lttng_event) * size);
+ sizeof(struct lttng_event) * nb_events);
free(events);
*/
case LTTNG_LIST_DOMAINS:
{
- size_t nb_dom;
+ size_t nb_dom = 0;
if (cmd_ctx->session->kernel_session != NULL) {
nb_dom++;