Change lttng API to use a lttng_handle
[lttng-tools.git] / lttng / commands / add_context.c
index cb0c08741c7113fd21734b7d065fca518e147b7f..619f7c9aca2af41a36da6bab95aa716810a31267 100644 (file)
@@ -47,6 +47,8 @@ enum {
        OPT_TYPE,
 };
 
+static struct lttng_handle *handle;
+
 /*
  * Taken from the LTTng ABI
  */
@@ -164,8 +166,8 @@ static struct poptOption long_options[] = {
                .u.perf = {                                             \
                        PERF_TYPE_HW_CACHE,                             \
                        (uint64_t) PERF_COUNT_HW_CACHE_##name           \
-                       * (uint64_t) PERF_COUNT_HW_CACHE_OP_##op        \
-                       * (uint64_t) PERF_COUNT_HW_CACHE_RESULT_##result, \
+                       | ((uint64_t) PERF_COUNT_HW_CACHE_OP_##op << 8) \
+                       | ((uint64_t) PERF_COUNT_HW_CACHE_RESULT_##result << 16), \
                },                                                      \
        }
 
@@ -267,14 +269,14 @@ static void print_ctx_type(FILE *ofp)
        int indent_len = strlen(indent);
        int len, i = 0;
 
-       fprintf(ofp, indent);
+       fprintf(ofp, "%s", indent);
        len = indent_len;
        while (ctx_opts[i].symbol != NULL) {
                if (len > indent_len) {
                        if (len + strlen(ctx_opts[i].symbol) + 2
                                        >= PRINT_LINE_LEN) {
                                fprintf(ofp, ",\n");
-                               fprintf(ofp, indent);
+                               fprintf(ofp, "%s", indent);
                                len = indent_len;
                        } else {
                                len += fprintf(ofp, ", ");
@@ -313,7 +315,7 @@ static void usage(FILE *ofp)
        fprintf(ofp, "\n");
        fprintf(ofp, "Example:\n");
        fprintf(ofp, "This command will add the context information 'prio' and two perf\n"
-                       "counters: hardware branch misses and cache-misses, to all events\n"
+                       "counters: hardware branch misses and cache misses, to all events\n"
                        "in the trace data output:\n");
        fprintf(ofp, "# lttng add-context -k -t prio -t perf:branch-misses -t perf:cache-misses\n");
        fprintf(ofp, "\n");
@@ -341,7 +343,7 @@ end:
 /*
  * Add context to channel or event.
  */
-static int add_context(void)
+static int add_context(char *session_name)
 {
        int ret = CMD_SUCCESS;
        struct lttng_event_context context;
@@ -349,19 +351,24 @@ static int add_context(void)
        struct ctx_type *type;
        char *ptr;
 
-       if (set_session_name(opt_session_name) < 0) {
-               ret = CMD_ERROR;
+       if (opt_kernel) {
+               dom.type = LTTNG_DOMAIN_KERNEL;
+       }
+
+       handle = lttng_create_handle(session_name, &dom);
+       if (handle == NULL) {
+               ret = -1;
                goto error;
        }
 
        /* Iterate over all context type given */
        cds_list_for_each_entry(type, &ctx_type_list.head, list) {
+
                context.ctx = type->opt->ctx_type;
                if (context.ctx == LTTNG_EVENT_CONTEXT_PERF_COUNTER) {
                        context.u.perf_counter.type = type->opt->u.perf.type;
                        context.u.perf_counter.config = type->opt->u.perf.config;
-                       strcpy(context.u.perf_counter.name,
-                              type->opt->symbol);
+                       strcpy(context.u.perf_counter.name, type->opt->symbol);
                        /* Replace : and - by _ */
                        while ((ptr = strchr(context.u.perf_counter.name, '-')) != NULL) {
                                *ptr = '_';
@@ -371,13 +378,11 @@ static int add_context(void)
                        }
                }
                if (opt_kernel) {
-                       /* Create kernel domain */
-                       dom.type = LTTNG_DOMAIN_KERNEL;
-
                        DBG("Adding kernel context");
-                       ret = lttng_add_context(&dom, &context, opt_event_name,
+                       ret = lttng_add_context(handle, &context, opt_event_name,
                                        opt_channel_name);
                        if (ret < 0) {
+                               fprintf(stderr, "%s: ", type->opt->symbol);
                                goto error;
                        } else {
                                MSG("Kernel context %s added", type->opt->symbol);
@@ -392,12 +397,14 @@ static int add_context(void)
                        ret = CMD_NOT_IMPLEMENTED;
                        goto error;
                } else {
-                       ERR("Please specify a tracer (kernel or user-space)");
+                       ERR("Please specify a tracer (--kernel or --userspace)");
                        goto error;
                }
        }
 
 error:
+       lttng_destroy_handle(handle);
+
        return ret;
 }
 
@@ -410,6 +417,7 @@ int cmd_add_context(int argc, const char **argv)
        char *tmp;
        static poptContext pc;
        struct ctx_type *type, *tmptype;
+       char *session_name = NULL;
 
        if (argc < 2) {
                usage(stderr);
@@ -460,7 +468,17 @@ int cmd_add_context(int argc, const char **argv)
                }
        }
 
-       ret = add_context();
+       if (!opt_session_name) {
+               session_name = get_session_name();
+               if (session_name == NULL) {
+                       ret = -1;
+                       goto end;
+               }
+       } else {
+               session_name = opt_session_name;
+       }
+
+       ret = add_context(session_name);
 
        /* Cleanup allocated memory */
        cds_list_for_each_entry_safe(type, tmptype, &ctx_type_list.head, list) {
This page took 0.028514 seconds and 4 git commands to generate.