Fix: lttng create allocated path memleak
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index b1e66e755bf0f621fb8c78f84a6d8c9043cedc55..260cff6715b2b0a4e9da948d97056e640664e448 100644 (file)
@@ -584,7 +584,7 @@ close_sock:
 static int send_consumer_relayd_sockets(int domain,
                struct ltt_session *session, struct consumer_output *consumer, int fd)
 {
-       int ret;
+       int ret = LTTNG_OK;
 
        assert(session);
        assert(consumer);
@@ -640,7 +640,7 @@ static int setup_relayd(struct ltt_session *session)
                        assert(socket->fd >= 0);
 
                        pthread_mutex_lock(socket->lock);
-                       send_consumer_relayd_sockets(LTTNG_DOMAIN_UST, session,
+                       ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_UST, session,
                                        usess->consumer, socket->fd);
                        pthread_mutex_unlock(socket->lock);
                        if (ret != LTTNG_OK) {
@@ -657,7 +657,7 @@ static int setup_relayd(struct ltt_session *session)
                        assert(socket->fd >= 0);
 
                        pthread_mutex_lock(socket->lock);
-                       send_consumer_relayd_sockets(LTTNG_DOMAIN_KERNEL, session,
+                       ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_KERNEL, session,
                                        ksess->consumer, socket->fd);
                        pthread_mutex_unlock(socket->lock);
                        if (ret != LTTNG_OK) {
@@ -1528,11 +1528,6 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session,
                goto error;
        }
 
-       if (!session->start_consumer) {
-               ret = LTTNG_ERR_NO_CONSUMER;
-               goto error;
-       }
-
        /*
         * This case switch makes sure the domain session has a temporary consumer
         * so the URL can be set.
@@ -2142,11 +2137,6 @@ int cmd_enable_consumer(int domain, struct ltt_session *session)
                goto error;
        }
 
-       if (!session->start_consumer) {
-               ret = LTTNG_ERR_NO_CONSUMER;
-               goto error;
-       }
-
        switch (domain) {
        case 0:
                assert(session->consumer);
@@ -2320,6 +2310,8 @@ int cmd_enable_consumer(int domain, struct ltt_session *session)
                break;
        }
 
+       session->start_consumer = 1;
+
        /* Enable it */
        if (consumer) {
                consumer->enabled = 1;
@@ -2334,6 +2326,47 @@ error:
        return ret;
 }
 
+/*
+ * Command LTTNG_DATA_AVAILABLE returning 0 if the data is NOT ready to be read
+ * or else 1 if the data is available for trace analysis.
+ */
+int cmd_data_available(struct ltt_session *session)
+{
+       int ret;
+       struct ltt_kernel_session *ksess = session->kernel_session;
+       struct ltt_ust_session *usess = session->ust_session;
+
+       assert(session);
+
+       /* Session MUST be stopped to ask for data availability. */
+       if (session->enabled) {
+               ret = LTTNG_ERR_SESSION_STARTED;
+               goto error;
+       }
+
+       if (ksess && ksess->consumer) {
+               ret = consumer_is_data_available(ksess->id, ksess->consumer);
+               if (ret == 0) {
+                       /* Data is still being extracted for the kernel. */
+                       goto error;
+               }
+       }
+
+       if (usess && usess->consumer) {
+               ret = consumer_is_data_available(usess->id, usess->consumer);
+               if (ret == 0) {
+                       /* Data is still being extracted for the kernel. */
+                       goto error;
+               }
+       }
+
+       /* Data is ready to be read by a viewer */
+       ret = 1;
+
+error:
+       return ret;
+}
+
 /*
  * Init command subsystem.
  */
This page took 0.02535 seconds and 5 git commands to generate.