Simply close socket when application registration is refused
[lttng-tools.git] / lttng-sessiond / main.c
index fa196e7b033bfe07f97ac994803afc384c6f274c..54dcbdff06f68965b8f2923160825e180bfe65c9 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.
  */
@@ -303,8 +305,14 @@ static void teardown_kernel_session(struct ltt_session *session)
  */
 static void teardown_ust_session(struct ltt_session *session)
 {
+       int ret;
+
        DBG("Tearing down UST session(s)");
 
+       ret = ust_app_destroy_trace_all(session->ust_session);
+       if (ret) {
+               ERR("Error in ust_app_destroy_trace_all");
+       }
        trace_ust_destroy_session(session->ust_session);
 }
 
@@ -588,9 +596,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;
        }
@@ -1052,9 +1060,10 @@ static void *thread_manage_apps(void *data)
                                        /* Register applicaton to the session daemon */
                                        ret = ust_app_register(&ust_cmd.reg_msg,
                                                        ust_cmd.sock);
-                                       if (ret < 0) {
-                                               /* Only critical ENOMEM error can be returned here */
+                                       if (ret == -ENOMEM) {
                                                goto error;
+                                       } else if (ret < 0) {
+                                               break;
                                        }
 
                                        /*
@@ -1260,9 +1269,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 +1797,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 +1889,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 +2096,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 +2107,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 +2367,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:
@@ -2499,6 +2520,10 @@ static int cmd_start_trace(struct ltt_session *session)
        ksession = session->kernel_session;
        usess = session->ust_session;
 
+       if (session->enabled)
+               return LTTCOMM_UST_START_FAIL;
+       session->enabled = 1;
+
        /* Kernel tracing */
        if (ksession != NULL) {
                struct ltt_kernel_channel *kchan;
@@ -2578,11 +2603,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) {
@@ -2610,32 +2639,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;
 
@@ -2670,6 +2683,8 @@ static int cmd_destroy_session(struct ltt_session *session, char *name)
 
        /* Clean kernel session teardown */
        teardown_kernel_session(session);
+       /* UST session teardown */
+       teardown_ust_session(session);
 
        /*
         * Must notify the kernel thread here to update it's poll setin order
@@ -2808,14 +2823,14 @@ static ssize_t cmd_list_channels(int domain, struct ltt_session *session,
                if (session->kernel_session != NULL) {
                        nb_chan = session->kernel_session->channel_count;
                }
-               DBG3("Number of kernel channels %ld", nb_chan);
+               DBG3("Number of kernel channels %zd", nb_chan);
                break;
        case LTTNG_DOMAIN_UST:
                if (session->ust_session != NULL) {
                        nb_chan = hashtable_get_count(
                                        session->ust_session->domain_global.channels);
                }
-               DBG3("Number of UST global channels %ld", nb_chan);
+               DBG3("Number of UST global channels %zd", nb_chan);
                break;
        default:
                *channels = NULL;
@@ -2999,8 +3014,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);
                }
@@ -3333,16 +3347,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;
                }
 
@@ -3379,7 +3393,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.02665 seconds and 4 git commands to generate.