Truncate exclusion names to have a terminal '\0'
[lttng-tools.git] / src / bin / lttng-sessiond / channel.c
index ff2db69db7389976c0c1dd3bd891cf5fbc969620..06a6d616af7a01d4c9207e6d7b86156e2d3b499e 100644 (file)
@@ -15,7 +15,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <inttypes.h>
 #include <string.h>
 #include <unistd.h>
@@ -25,6 +25,7 @@
 #include <common/sessiond-comm/sessiond-comm.h>
 
 #include "channel.h"
+#include "lttng-sessiond.h"
 #include "kernel.h"
 #include "ust-ctl.h"
 #include "utils.h"
@@ -33,7 +34,8 @@
 /*
  * Return allocated channel attributes.
  */
-struct lttng_channel *channel_new_default_attr(int dom)
+struct lttng_channel *channel_new_default_attr(int dom,
+               enum lttng_buffer_type type)
 {
        struct lttng_channel *chan;
 
@@ -49,28 +51,48 @@ struct lttng_channel *channel_new_default_attr(int dom)
                goto error;
        }
 
+       /* Same for all domains. */
        chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
+       chan->attr.tracefile_size = DEFAULT_CHANNEL_TRACEFILE_SIZE;
+       chan->attr.tracefile_count = DEFAULT_CHANNEL_TRACEFILE_COUNT;
 
        switch (dom) {
        case LTTNG_DOMAIN_KERNEL:
+               assert(type == LTTNG_BUFFER_GLOBAL);
                chan->attr.subbuf_size =
                        default_get_kernel_channel_subbuf_size();
                chan->attr.num_subbuf = DEFAULT_KERNEL_CHANNEL_SUBBUF_NUM;
                chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT;
                chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER;
                chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER;
+               chan->attr.live_timer_interval = DEFAULT_KERNEL_CHANNEL_LIVE_TIMER;
                break;
        case LTTNG_DOMAIN_UST:
-#if 0
-       case LTTNG_DOMAIN_UST_PID:
-       case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
-       case LTTNG_DOMAIN_UST_EXEC_NAME:
-#endif
-               chan->attr.subbuf_size = default_get_ust_channel_subbuf_size();
-               chan->attr.num_subbuf = DEFAULT_UST_CHANNEL_SUBBUF_NUM;
-               chan->attr.output = DEFAULT_UST_CHANNEL_OUTPUT;
-               chan->attr.switch_timer_interval = DEFAULT_UST_CHANNEL_SWITCH_TIMER;
-               chan->attr.read_timer_interval = DEFAULT_UST_CHANNEL_READ_TIMER;
+               switch (type) {
+               case LTTNG_BUFFER_PER_UID:
+                       chan->attr.subbuf_size = default_get_ust_uid_channel_subbuf_size();
+                       chan->attr.num_subbuf = DEFAULT_UST_UID_CHANNEL_SUBBUF_NUM;
+                       chan->attr.output = DEFAULT_UST_UID_CHANNEL_OUTPUT;
+                       chan->attr.switch_timer_interval =
+                               DEFAULT_UST_UID_CHANNEL_SWITCH_TIMER;
+                       chan->attr.read_timer_interval =
+                               DEFAULT_UST_UID_CHANNEL_READ_TIMER;
+                       chan->attr.live_timer_interval =
+                               DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+                       break;
+               case LTTNG_BUFFER_PER_PID:
+               default:
+                       chan->attr.subbuf_size = default_get_ust_pid_channel_subbuf_size();
+                       chan->attr.num_subbuf = DEFAULT_UST_PID_CHANNEL_SUBBUF_NUM;
+                       chan->attr.output = DEFAULT_UST_PID_CHANNEL_OUTPUT;
+                       chan->attr.switch_timer_interval =
+                               DEFAULT_UST_PID_CHANNEL_SWITCH_TIMER;
+                       chan->attr.read_timer_interval =
+                               DEFAULT_UST_PID_CHANNEL_READ_TIMER;
+                       chan->attr.live_timer_interval =
+                               DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+                       break;
+               }
                break;
        default:
                goto error;     /* Not implemented */
@@ -158,7 +180,8 @@ int channel_kernel_create(struct ltt_kernel_session *ksession,
 
        /* Creating channel attributes if needed */
        if (attr == NULL) {
-               defattr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL);
+               defattr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL,
+                               LTTNG_BUFFER_GLOBAL);
                if (defattr == NULL) {
                        ret = LTTNG_ERR_FATAL;
                        goto error;
@@ -166,6 +189,12 @@ int channel_kernel_create(struct ltt_kernel_session *ksession,
                attr = defattr;
        }
 
+       if (ksession->snapshot_mode) {
+               /* Force channel attribute for snapshot mode. */
+               attr->attr.overwrite = 1;
+               attr->attr.output = LTTNG_EVENT_MMAP;
+       }
+
        /* Channel not found, creating it */
        ret = kernel_create_channel(ksession, attr);
        if (ret < 0) {
@@ -237,7 +266,7 @@ int channel_ust_create(struct ltt_ust_session *usess,
 
        /* Creating channel attributes if needed */
        if (attr == NULL) {
-               defattr = channel_new_default_attr(LTTNG_DOMAIN_UST);
+               defattr = channel_new_default_attr(LTTNG_DOMAIN_UST, type);
                if (defattr == NULL) {
                        ret = LTTNG_ERR_FATAL;
                        goto error;
@@ -245,9 +274,10 @@ int channel_ust_create(struct ltt_ust_session *usess,
                attr = defattr;
        }
 
-       if (attr->attr.subbuf_size < DEFAULT_UST_CHANNEL_SUBBUF_SIZE) {
-               ret = LTTNG_ERR_INVALID;
-               goto error;
+       if (usess->snapshot_mode) {
+               /* Force channel attribute for snapshot mode. */
+               attr->attr.overwrite = 1;
+               attr->attr.output = LTTNG_EVENT_MMAP;
        }
 
        /*
@@ -261,6 +291,14 @@ int channel_ust_create(struct ltt_ust_session *usess,
                goto error;
        }
 
+       /*
+        * Invalid subbuffer size if it's lower then the page size.
+        */
+       if (attr->attr.subbuf_size < page_size) {
+               ret = LTTNG_ERR_INVALID;
+               goto error;
+       }
+
        if (!attr->attr.num_subbuf ||
                        (attr->attr.num_subbuf & (attr->attr.num_subbuf - 1))) {
                ret = LTTNG_ERR_INVALID;
@@ -285,6 +323,7 @@ int channel_ust_create(struct ltt_ust_session *usess,
        /* Validate buffer type. */
        switch (type) {
        case LTTNG_BUFFER_PER_PID:
+               break;
        case LTTNG_BUFFER_PER_UID:
                break;
        default:
@@ -293,11 +332,24 @@ int channel_ust_create(struct ltt_ust_session *usess,
        }
 
        /* Create UST channel */
-       uchan = trace_ust_create_channel(attr);
+       uchan = trace_ust_create_channel(attr, LTTNG_DOMAIN_UST);
        if (uchan == NULL) {
                ret = LTTNG_ERR_FATAL;
                goto error;
        }
+
+       /*
+        * HACK: Set the channel's subdomain (JUL, Log4j, Python, etc.)
+        * based on the default name.
+        */
+       if (!strcmp(uchan->name, DEFAULT_JUL_CHANNEL_NAME)) {
+               uchan->domain = LTTNG_DOMAIN_JUL;
+       } else if (!strcmp(uchan->name, DEFAULT_LOG4J_CHANNEL_NAME)) {
+               uchan->domain = LTTNG_DOMAIN_LOG4J;
+       } else if (!strcmp(uchan->name, DEFAULT_PYTHON_CHANNEL_NAME)) {
+               uchan->domain = LTTNG_DOMAIN_PYTHON;
+       }
+
        uchan->enabled = 1;
        if (trace_ust_is_max_id(usess->used_channel_id)) {
                ret = LTTNG_ERR_UST_CHAN_FAIL;
@@ -327,7 +379,18 @@ int channel_ust_create(struct ltt_ust_session *usess,
 
        /* Adding the channel to the channel hash table. */
        rcu_read_lock();
-       lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+       if (strncmp(uchan->name, DEFAULT_METADATA_NAME,
+                               sizeof(uchan->name))) {
+               lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+       } else {
+               /*
+                * Copy channel attribute to session if this is metadata so if NO
+                * application exists we can access that data in the shadow copy during
+                * the global update of newly registered application.
+                */
+               memcpy(&usess->metadata_attr, &uchan->attr,
+                               sizeof(usess->metadata_attr));
+       }
        rcu_read_unlock();
 
        DBG2("Channel %s created successfully", uchan->name);
This page took 0.024783 seconds and 4 git commands to generate.