Fix: Add output option to enable-channel command
authorDavid Goulet <dgoulet@efficios.com>
Fri, 2 Nov 2012 16:38:33 +0000 (12:38 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Fri, 2 Nov 2012 16:49:34 +0000 (12:49 -0400)
Allow to specify an output mode for the channel (MMAP or SPLICE).

A new error code is introduced to notify the user that the operation is
not supported. Useful for user space tracing which does NOT support
splice mode.

Fixes #335

Signed-off-by: David Goulet <dgoulet@efficios.com>
include/lttng/lttng-error.h
src/bin/lttng-sessiond/channel.c
src/bin/lttng/commands/enable_channels.c
src/common/error.c

index c728913bcd7052fdd853b00d33aae1935d5317be..26f05ab4a73bd4a9b4e3036ae0d9842a8c8ab719 100644 (file)
@@ -35,7 +35,7 @@ enum lttng_error_code {
        LTTNG_ERR_UND                    = 12,  /* Undefine command */
        LTTNG_ERR_SESSION_STARTED        = 13,  /* Session is running */
        LTTNG_ERR_UNKNOWN_DOMAIN         = 14,  /* Tracing domain not known */
-       /* 15 */
+       LTTNG_ERR_NOT_SUPPORTED          = 15,  /* Operation not supported */
        LTTNG_ERR_NO_SESSION             = 16,  /* No session found */
        LTTNG_ERR_CREATE_DIR_FAIL        = 17,  /* Create directory fail */
        LTTNG_ERR_SESSION_FAIL           = 18,  /* Create session fail */
index dfc7892674bbe1f15dc74d818175ea3c60c3c65d..e2cdf563a6bbc42f9cf6f583b323c8c25b6217b8 100644 (file)
@@ -254,6 +254,11 @@ int channel_ust_create(struct ltt_ust_session *usess, int domain,
                goto error;
        }
 
+       if (attr->attr.output != LTTNG_EVENT_MMAP) {
+               ret = LTTNG_ERR_NOT_SUPPORTED;
+               goto error;
+       }
+
        /* Create UST channel */
        uchan = trace_ust_create_channel(attr, usess->pathname);
        if (uchan == NULL) {
index a5b15fae7f46e7b93856aa46545c73b872124244..18574775b1c4843188530d885997424d415cc430 100644 (file)
@@ -34,6 +34,7 @@ static int opt_kernel;
 static char *opt_session_name;
 static int opt_userspace;
 static struct lttng_channel chan;
+static char *opt_output;
 #if 0
 /* Not implemented yet */
 static char *opt_cmd_name;
@@ -54,6 +55,9 @@ enum {
 
 static struct lttng_handle *handle;
 
+const char *output_mmap = "mmap";
+const char *output_splice = "splice";
+
 static struct poptOption long_options[] = {
        /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
        {"help",           'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
@@ -73,6 +77,7 @@ static struct poptOption long_options[] = {
        {"switch-timer",   0,   POPT_ARG_INT, 0, OPT_SWITCH_TIMER, 0, 0},
        {"read-timer",     0,   POPT_ARG_INT, 0, OPT_READ_TIMER, 0, 0},
        {"list-options",   0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL},
+       {"output",         0,   POPT_ARG_STRING, &opt_output, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0}
 };
 
@@ -110,6 +115,8 @@ static void usage(FILE *ofp)
                DEFAULT_CHANNEL_SWITCH_TIMER);
        fprintf(ofp, "      --read-timer USEC    Read timer interval in usec (default: %u)\n",
                DEFAULT_CHANNEL_READ_TIMER);
+       fprintf(ofp, "      --output TYPE        Channel output type (Values: %s, %s)\n",
+                       output_mmap, output_splice);
        fprintf(ofp, "\n");
 }
 
@@ -168,6 +175,21 @@ static int enable_channel(char *session_name)
 
        set_default_attr(&dom);
 
+       /* Setting channel output */
+       if (opt_output) {
+               if (!strncmp(output_mmap, opt_output, strlen(output_mmap))) {
+                       chan.attr.output = LTTNG_EVENT_MMAP;
+               } else if (!strncmp(output_splice, opt_output, strlen(output_splice))) {
+                       chan.attr.output = LTTNG_EVENT_SPLICE;
+               } else {
+                       ERR("Unknown output type %s. Possible values are: %s, %s\n",
+                                       opt_output, output_mmap, output_splice);
+                       usage(stderr);
+                       ret = CMD_ERROR;
+                       goto error;
+               }
+       }
+
        handle = lttng_create_handle(session_name, &dom);
        if (handle == NULL) {
                ret = -1;
index 4354cc3bbf6353bf30df4a9c7d9bb3e7a3a027b7..0a3b5b3e11b83050e3d9e6bf794dfe0e393badc0 100644 (file)
@@ -100,6 +100,7 @@ static const char *error_string_array[] = {
        [ ERROR_INDEX(LTTNG_ERR_NO_CONSUMER) ] = "Consumer not found for tracing session",
        [ ERROR_INDEX(LTTNG_ERR_NO_SESSIOND) ] = "No session daemon is available",
        [ ERROR_INDEX(LTTNG_ERR_SESSION_STARTED) ] = "Session is running",
+       [ ERROR_INDEX(LTTNG_ERR_NOT_SUPPORTED) ] = "Operation not supported",
 
        /* Last element */
        [ ERROR_INDEX(LTTNG_ERR_NR) ] = "Unknown error code"
This page took 0.027643 seconds and 4 git commands to generate.