Change disable event command to be per domain
[lttng-tools.git] / ltt-sessiond / main.c
index 0af4dcdccb7cdb2ec67b2cd423a6f77902687787..c2a4be9af24e76f8d83459480487ccf16f9b3de0 100644 (file)
@@ -41,6 +41,7 @@
 #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"
@@ -1272,11 +1273,11 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
        case LTTNG_LIST_TRACEPOINTS:
                break;
        default:
-               DBG("Getting session %s by name", cmd_ctx->lsm->session_name);
-               cmd_ctx->session = find_session_by_name(cmd_ctx->lsm->session_name);
+               DBG("Getting session %s by name", cmd_ctx->lsm->session.name);
+               cmd_ctx->session = find_session_by_name(cmd_ctx->lsm->session.name);
                if (cmd_ctx->session == NULL) {
                        /* If session name not found */
-                       if (cmd_ctx->lsm->session_name != NULL) {
+                       if (cmd_ctx->lsm->session.name != NULL) {
                                ret = LTTCOMM_SESS_NOT_FOUND;
                        } else {        /* If no session name specified */
                                ret = LTTCOMM_SELECT_SESS;
@@ -1293,10 +1294,10 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
         * Check kernel command for kernel session.
         */
        switch (cmd_ctx->lsm->cmd_type) {
-       case LTTNG_KERNEL_ADD_CONTEXT:
-       case LTTNG_KERNEL_DISABLE_ALL_EVENT:
-       case LTTNG_KERNEL_DISABLE_CHANNEL:
-       case LTTNG_KERNEL_DISABLE_EVENT:
+       case LTTNG_ADD_CONTEXT:
+       case LTTNG_DISABLE_ALL_EVENT:
+       case LTTNG_DISABLE_CHANNEL:
+       case LTTNG_DISABLE_EVENT:
        case LTTNG_KERNEL_ENABLE_ALL_EVENT:
        case LTTNG_KERNEL_ENABLE_CHANNEL:
        case LTTNG_KERNEL_ENABLE_EVENT:
@@ -1344,12 +1345,9 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
 
        /* 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);
@@ -1357,80 +1355,36 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                        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;
+                       break;
+               default:
+                       /* TODO: Userspace tracing */
+                       ret = LTTCOMM_NOT_IMPLEMENTED;
                        goto error;
                }
 
                ret = LTTCOMM_OK;
                break;
        }
-       case LTTNG_KERNEL_DISABLE_CHANNEL:
+       case LTTNG_DISABLE_CHANNEL:
        {
-               struct ltt_kernel_channel *chan;
+               struct ltt_kernel_channel *kchan;
 
                /* Setup lttng message with no payload */
                ret = setup_lttng_msg(cmd_ctx, 0);
@@ -1438,29 +1392,37 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                        goto setup_error;
                }
 
-               chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name,
-                               cmd_ctx->session->kernel_session);
-               if (chan == NULL) {
-                       ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
-                       goto error;
-               } else if (chan->enabled == 1) {
-                       ret = kernel_disable_channel(chan);
-                       if (ret < 0) {
-                               if (ret != EEXIST) {
-                                       ret = LTTCOMM_KERN_CHAN_DISABLE_FAIL;
-                               }
+               switch (cmd_ctx->lsm->domain.type) {
+               case LTTNG_DOMAIN_KERNEL:
+                       kchan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name,
+                                       cmd_ctx->session->kernel_session);
+                       if (kchan == NULL) {
+                               ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
                                goto error;
+                       } else if (kchan->enabled == 1) {
+                               ret = kernel_disable_channel(kchan);
+                               if (ret < 0) {
+                                       if (ret != EEXIST) {
+                                               ret = LTTCOMM_KERN_CHAN_DISABLE_FAIL;
+                                       }
+                                       goto error;
+                               }
                        }
+                       kernel_wait_quiescent(kernel_tracer_fd);
+                       break;
+               default:
+                       /* TODO: Userspace tracing */
+                       ret = LTTCOMM_NOT_IMPLEMENTED;
+                       goto error;
                }
 
-               kernel_wait_quiescent(kernel_tracer_fd);
                ret = LTTCOMM_OK;
                break;
        }
-       case LTTNG_KERNEL_DISABLE_EVENT:
+       case LTTNG_DISABLE_EVENT:
        {
-               struct ltt_kernel_channel *chan;
-               struct ltt_kernel_event *ev;
+               struct ltt_kernel_channel *kchan;
+               struct ltt_kernel_event *kevent;
 
                /* Setup lttng message with no payload */
                ret = setup_lttng_msg(cmd_ctx, 0);
@@ -1468,32 +1430,41 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                        goto setup_error;
                }
 
-               chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name,
-                               cmd_ctx->session->kernel_session);
-               if (chan == NULL) {
-                       ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
-                       goto error;
-               }
-
-               ev = get_kernel_event_by_name(cmd_ctx->lsm->u.disable.name, chan);
-               if (ev != NULL) {
-                       DBG("Disabling kernel event %s for channel %s.",
-                                       cmd_ctx->lsm->u.disable.name, cmd_ctx->lsm->u.disable.channel_name);
-                       ret = kernel_disable_event(ev);
-                       if (ret < 0) {
-                               ret = LTTCOMM_KERN_ENABLE_FAIL;
+               switch (cmd_ctx->lsm->domain.type) {
+               case LTTNG_DOMAIN_KERNEL:
+                       kchan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name,
+                                       cmd_ctx->session->kernel_session);
+                       if (kchan == NULL) {
+                               ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
                                goto error;
                        }
+
+                       kevent = get_kernel_event_by_name(cmd_ctx->lsm->u.disable.name, kchan);
+                       if (kevent != NULL) {
+                               DBG("Disabling kernel event %s for channel %s.", kevent->event->name,
+                                               kchan->channel->name);
+                               ret = kernel_disable_event(kevent);
+                               if (ret < 0) {
+                                       ret = LTTCOMM_KERN_ENABLE_FAIL;
+                                       goto error;
+                               }
+                       }
+
+                       kernel_wait_quiescent(kernel_tracer_fd);
+                       break;
+               default:
+                       /* TODO: Userspace tracing */
+                       ret = LTTCOMM_NOT_IMPLEMENTED;
+                       goto error;
                }
 
-               kernel_wait_quiescent(kernel_tracer_fd);
                ret = LTTCOMM_OK;
                break;
        }
-       case LTTNG_KERNEL_DISABLE_ALL_EVENT:
+       case LTTNG_DISABLE_ALL_EVENT:
        {
-               struct ltt_kernel_channel *chan;
-               struct ltt_kernel_event *ev;
+               struct ltt_kernel_channel *kchan;
+               struct ltt_kernel_event *kevent;
 
                /* Setup lttng message with no payload */
                ret = setup_lttng_msg(cmd_ctx, 0);
@@ -1501,27 +1472,35 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                        goto setup_error;
                }
 
-               DBG("Disabling all enabled kernel events");
-
-               chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name,
-                               cmd_ctx->session->kernel_session);
-               if (chan == NULL) {
-                       ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
-                       goto error;
-               }
+               switch (cmd_ctx->lsm->domain.type) {
+               case LTTNG_DOMAIN_KERNEL:
+                       DBG("Disabling all enabled kernel events");
+                       kchan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name,
+                                       cmd_ctx->session->kernel_session);
+                       if (kchan == NULL) {
+                               ret = LTTCOMM_KERN_CHAN_NOT_FOUND;
+                               goto error;
+                       }
 
-               /* For each event in the kernel session */
-               cds_list_for_each_entry(ev, &chan->events_list.head, list) {
-                       DBG("Disabling kernel event %s for channel %s.",
-                                       ev->event->name, cmd_ctx->lsm->u.disable.channel_name);
-                       ret = kernel_disable_event(ev);
-                       if (ret < 0) {
-                               continue;
+                       /* For each event in the kernel session */
+                       cds_list_for_each_entry(kevent, &kchan->events_list.head, list) {
+                               DBG("Disabling kernel event %s for channel %s.",
+                                               kevent->event->name, kchan->channel->name);
+                               ret = kernel_disable_event(kevent);
+                               if (ret < 0) {
+                                       continue;
+                               }
                        }
+
+                       /* Quiescent wait after event disable */
+                       kernel_wait_quiescent(kernel_tracer_fd);
+                       break;
+               default:
+                       /* TODO: Userspace tracing */
+                       ret = LTTCOMM_NOT_IMPLEMENTED;
+                       goto error;
                }
 
-               /* Quiescent wait after event disable */
-               kernel_wait_quiescent(kernel_tracer_fd);
                ret = LTTCOMM_OK;
                break;
        }
@@ -1863,7 +1842,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                        goto setup_error;
                }
 
-               ret = create_session(cmd_ctx->lsm->session_name, cmd_ctx->lsm->path);
+               ret = create_session(cmd_ctx->lsm->session.name, cmd_ctx->lsm->session.path);
                if (ret < 0) {
                        if (ret == -EEXIST) {
                                ret = LTTCOMM_EXIST_SESS;
@@ -1887,7 +1866,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                /* Clean kernel session teardown */
                teardown_kernel_session(cmd_ctx->session);
 
-               ret = destroy_session(cmd_ctx->lsm->session_name);
+               ret = destroy_session(cmd_ctx->lsm->session.name);
                if (ret < 0) {
                        ret = LTTCOMM_FATAL;
                        goto error;
This page took 0.028296 seconds and 4 git commands to generate.