Implement UST stop command
[lttng-tools.git] / lttng-sessiond / main.c
index d1d184d89eae8915d8d8808a638ca245e0b98765..9464c2c1b8e0f4f3d17ef300cf15975d2174c6ec 100644 (file)
@@ -157,6 +157,8 @@ static struct ust_cmd_queue ust_cmd_queue;
  */
 static struct ltt_session_list *session_list_ptr;
 
+int ust_consumer_fd;
+
 /*
  * Create a poll set with O_CLOEXEC and add the thread quit pipe to the set.
  */
@@ -588,9 +590,9 @@ static int setup_lttng_msg(struct command_ctx *cmd_ctx, size_t size)
 
        buf_size = size;
 
-       cmd_ctx->llm = malloc(sizeof(struct lttcomm_lttng_msg) + buf_size);
+       cmd_ctx->llm = zmalloc(sizeof(struct lttcomm_lttng_msg) + buf_size);
        if (cmd_ctx->llm == NULL) {
-               perror("malloc");
+               perror("zmalloc");
                ret = -ENOMEM;
                goto error;
        }
@@ -1098,7 +1100,7 @@ static void *thread_manage_apps(void *data)
                                                goto error;
                                        }
 
-                                       /* Socket closed */
+                                       /* Socket closed on remote end. */
                                        ust_app_unregister(pollfd);
                                        break;
                                }
@@ -1260,9 +1262,9 @@ static void *thread_registration_apps(void *data)
                                        }
 
                                        /* Create UST registration command for enqueuing */
-                                       ust_cmd = malloc(sizeof(struct ust_command));
+                                       ust_cmd = zmalloc(sizeof(struct ust_command));
                                        if (ust_cmd == NULL) {
-                                               perror("ust command malloc");
+                                               perror("ust command zmalloc");
                                                goto error;
                                        }
 
@@ -1788,6 +1790,7 @@ static void list_lttng_sessions(struct lttng_session *sessions)
                sessions[i].path[PATH_MAX - 1] = '\0';
                strncpy(sessions[i].name, session->name, NAME_MAX);
                sessions[i].name[NAME_MAX - 1] = '\0';
+               sessions[i].enabled = session->enabled;
                i++;
        }
 }
@@ -1879,6 +1882,7 @@ static int list_lttng_ust_global_events(char *channel_name,
                cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) {
                        strncpy(tmp[i].name, uevent->attr.name, LTTNG_SYMBOL_NAME_LEN);
                        tmp[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
+                       tmp[i].enabled = uevent->enabled;
                        switch (uevent->attr.instrumentation) {
                        case LTTNG_UST_TRACEPOINT:
                                tmp[i].type = LTTNG_EVENT_TRACEPOINT;
@@ -2085,6 +2089,7 @@ static int cmd_enable_channel(struct ltt_session *session,
                                ret = LTTCOMM_UST_CHAN_FAIL;
                                goto error;
                        }
+
                        rcu_read_lock();
                        hashtable_add_unique(usess->domain_global.channels, &uchan->node);
                        rcu_read_unlock();
@@ -2095,11 +2100,13 @@ static int cmd_enable_channel(struct ltt_session *session,
                }
 
                /* Add channel to all registered applications */
-               ret = ust_app_add_channel_all(usess, uchan);
+               ret = ust_app_create_channel_all(usess, uchan);
                if (ret != 0) {
                        goto error;
                }
 
+               uchan->enabled = 1;
+
                break;
        }
        case LTTNG_DOMAIN_UST_PID:
@@ -2353,17 +2360,24 @@ static int cmd_enable_event(struct ltt_session *session, int domain,
                                ret = LTTCOMM_FATAL;
                                goto error;
                        }
+
                }
 
-               ret = ust_app_add_event_all(usess, uchan, uevent);
+               ret = ust_app_create_event_all(usess, uchan, uevent);
                if (ret < 0) {
                        ret = LTTCOMM_UST_ENABLE_FAIL;
                        goto error;
                }
 
+               /* Add ltt ust event to channel */
                rcu_read_lock();
                hashtable_add_unique(uchan->events, &uevent->node);
                rcu_read_unlock();
+
+               uevent->enabled = 1;
+
+               DBG3("UST ltt event %s added to channel %s", uevent->attr.name,
+                               uchan->name);
                break;
        }
        case LTTNG_DOMAIN_UST_EXEC_NAME:
@@ -2493,10 +2507,15 @@ static int cmd_start_trace(struct ltt_session *session)
 {
        int ret;
        struct ltt_kernel_session *ksession;
-       struct ltt_ust_session *usess = session->ust_session;
+       struct ltt_ust_session *usess;
 
        /* Short cut */
        ksession = session->kernel_session;
+       usess = session->ust_session;
+
+       if (session->enabled)
+               return LTTCOMM_UST_START_FAIL;
+       session->enabled = 1;
 
        /* Kernel tracing */
        if (ksession != NULL) {
@@ -2553,12 +2572,14 @@ static int cmd_start_trace(struct ltt_session *session)
        }
 
        /* Flag session that trace should start automatically */
-       usess->start_trace = 1;
+       if (usess) {
+               usess->start_trace = 1;
 
-       ret = ust_app_start_trace_all(usess);
-       if (ret < 0) {
-               ret = LTTCOMM_UST_START_FAIL;
-               goto error;
+               ret = ust_app_start_trace_all(usess);
+               if (ret < 0) {
+                       ret = LTTCOMM_UST_START_FAIL;
+                       goto error;
+               }
        }
 
        ret = LTTCOMM_OK;
@@ -2575,11 +2596,15 @@ static int cmd_stop_trace(struct ltt_session *session)
        int ret;
        struct ltt_kernel_channel *kchan;
        struct ltt_kernel_session *ksession;
-       //struct ltt_ust_session *usess;
-       //struct ltt_ust_channel *ustchan;
+       struct ltt_ust_session *usess;
 
        /* Short cut */
        ksession = session->kernel_session;
+       usess = session->ust_session;
+
+       if (!session->enabled)
+               return LTTCOMM_UST_START_FAIL;
+       session->enabled = 0;
 
        /* Kernel tracer */
        if (ksession != NULL) {
@@ -2607,32 +2632,16 @@ static int cmd_stop_trace(struct ltt_session *session)
                kernel_wait_quiescent(kernel_tracer_fd);
        }
 
-#ifdef DISABLE
-       /* Stop each UST session */
-       DBG("Stop UST tracing");
-       cds_list_for_each_entry(usess, &session->ust_session_list.head, list) {
-               /* Flush all buffers before stopping */
-               ret = ustctl_flush_buffer(usess->sock, usess->metadata->obj);
-               if (ret < 0) {
-                       ERR("UST metadata flush failed");
-               }
-
-               cds_list_for_each_entry(ustchan, &usess->channels.head, list) {
-                       ret = ustctl_flush_buffer(usess->sock, ustchan->obj);
-                       if (ret < 0) {
-                               ERR("UST flush buffer error");
-                       }
-               }
+       /* Flag session that trace should start automatically */
+       if (usess) {
+               usess->start_trace = 0;
 
-               ret = ustctl_stop_session(usess->sock, usess->handle);
+               ret = ust_app_stop_trace_all(usess);
                if (ret < 0) {
-                       ret = LTTCOMM_KERN_STOP_FAIL;
+                       ret = LTTCOMM_UST_START_FAIL;
                        goto error;
                }
-
-               ustctl_wait_quiescent(usess->sock);
        }
-#endif
 
        ret = LTTCOMM_OK;
 
@@ -2996,8 +3005,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                                        goto error;
                                }
 
-                               cmd_ctx->session->ust_session->consumer_fd =
-                                       ustconsumer_data.cmd_sock;
+                               ust_consumer_fd = ustconsumer_data.cmd_sock;
                        }
                        pthread_mutex_unlock(&ustconsumer_data.pid_mutex);
                }
@@ -3330,16 +3338,16 @@ static void *thread_manage_clients(void *data)
                }
 
                /* Allocate context command to process the client request */
-               cmd_ctx = malloc(sizeof(struct command_ctx));
+               cmd_ctx = zmalloc(sizeof(struct command_ctx));
                if (cmd_ctx == NULL) {
-                       perror("malloc cmd_ctx");
+                       perror("zmalloc cmd_ctx");
                        goto error;
                }
 
                /* Allocate data buffer for reception */
-               cmd_ctx->lsm = malloc(sizeof(struct lttcomm_session_msg));
+               cmd_ctx->lsm = zmalloc(sizeof(struct lttcomm_session_msg));
                if (cmd_ctx->lsm == NULL) {
-                       perror("malloc cmd_ctx->lsm");
+                       perror("zmalloc cmd_ctx->lsm");
                        goto error;
                }
 
@@ -3376,7 +3384,7 @@ static void *thread_manage_clients(void *data)
                if (ret < 0) {
                        /*
                         * TODO: Inform client somehow of the fatal error. At
-                        * this point, ret < 0 means that a malloc failed
+                        * this point, ret < 0 means that a zmalloc failed
                         * (ENOMEM). Error detected but still accept command.
                         */
                        clean_command_ctx(&cmd_ctx);
This page took 0.027113 seconds and 4 git commands to generate.