Clean-up: sessiond: prepend `the_` to global variable names
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index 81e3bd848a2b492695ef942df8928ee018f6987b..3efda83c194149bedcf68a083db077897297e4dd 100644 (file)
@@ -7,11 +7,14 @@
  */
 
 #define _LGPL_SOURCE
+#include <errno.h>
+#include <fcntl.h>
 #include <inttypes.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
@@ -32,6 +35,7 @@
 #include <common/sessiond-comm/sessiond-comm.h>
 
 #include "buffer-registry.h"
+#include "condition-internal.h"
 #include "fd-limit.h"
 #include "health-sessiond.h"
 #include "ust-app.h"
@@ -44,6 +48,8 @@
 #include "notification-thread-commands.h"
 #include "rotate.h"
 #include "event.h"
+#include "event-notifier-error-accounting.h"
+
 
 struct lttng_ht *ust_app_ht;
 struct lttng_ht *ust_app_ht_by_sock;
@@ -999,16 +1005,23 @@ void delete_ust_app(struct ust_app *app)
         */
        if (app->event_notifier_group.object) {
                enum lttng_error_code ret_code;
+               enum event_notifier_error_accounting_status status;
+
                const int event_notifier_read_fd = lttng_pipe_get_readfd(
                                app->event_notifier_group.event_pipe);
 
                ret_code = notification_thread_command_remove_tracer_event_source(
-                               notification_thread_handle,
+                               the_notification_thread_handle,
                                event_notifier_read_fd);
                if (ret_code != LTTNG_OK) {
                        ERR("Failed to remove application tracer event source from notification thread");
                }
 
+               status = event_notifier_error_accounting_unregister_app(app);
+               if (status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
+                       ERR("Error unregistering app from event notifier error accounting");
+               }
+
                ustctl_release_object(sock, app->event_notifier_group.object);
                free(app->event_notifier_group.object);
        }
@@ -2000,7 +2013,6 @@ static int init_ust_event_notifier_from_event_rule(
                struct lttng_ust_abi_event_notifier *event_notifier)
 {
        enum lttng_event_rule_status status;
-       enum lttng_loglevel_type loglevel_type;
        enum lttng_ust_abi_loglevel_type ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL;
        int loglevel = -1, ret = 0;
        const char *pattern;
@@ -2023,39 +2035,40 @@ static int init_ust_event_notifier_from_event_rule(
                loglevel = 0;
                ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL;
        } else {
-               status = lttng_event_rule_tracepoint_get_pattern(
-                               rule, &pattern);
-               if (status != LTTNG_EVENT_RULE_STATUS_OK) {
-                       /* At this point, this is a fatal error. */
-                       abort();
-               }
+               const struct lttng_log_level_rule *log_level_rule;
 
-               status = lttng_event_rule_tracepoint_get_log_level_type(
-                               rule, &loglevel_type);
+               status = lttng_event_rule_tracepoint_get_pattern(rule, &pattern);
                if (status != LTTNG_EVENT_RULE_STATUS_OK) {
                        /* At this point, this is a fatal error. */
                        abort();
                }
 
-               switch (loglevel_type) {
-               case LTTNG_EVENT_LOGLEVEL_ALL:
+               status = lttng_event_rule_tracepoint_get_log_level_rule(
+                               rule, &log_level_rule);
+               if (status == LTTNG_EVENT_RULE_STATUS_UNSET) {
                        ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL;
-                       break;
-               case LTTNG_EVENT_LOGLEVEL_RANGE:
-                       ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_RANGE;
-                       break;
-               case LTTNG_EVENT_LOGLEVEL_SINGLE:
-                       ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_SINGLE;
-                       break;
-               default:
-                       /* Unknown log level specification type. */
-                       abort();
-               }
+               } else if (status == LTTNG_EVENT_RULE_STATUS_OK) {
+                       enum lttng_log_level_rule_status llr_status;
+
+                       switch (lttng_log_level_rule_get_type(log_level_rule)) {
+                       case LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY:
+                               ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_SINGLE;
+                               llr_status = lttng_log_level_rule_exactly_get_level(
+                                               log_level_rule, &loglevel);
+                               break;
+                       case LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS:
+                               ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_RANGE;
+                               llr_status = lttng_log_level_rule_at_least_as_severe_as_get_level(
+                                               log_level_rule, &loglevel);
+                               break;
+                       default:
+                               abort();
+                       }
 
-               if (loglevel_type != LTTNG_EVENT_LOGLEVEL_ALL) {
-                       status = lttng_event_rule_tracepoint_get_log_level(
-                                       rule, &loglevel);
-                       assert(status == LTTNG_EVENT_RULE_STATUS_OK);
+                       assert(llr_status == LTTNG_LOG_LEVEL_RULE_STATUS_OK);
+               } else {
+                       /* At this point this is a fatal error. */
+                       abort();
                }
        }
 
@@ -2106,6 +2119,7 @@ static int create_ust_event_notifier(struct ust_app *app,
 
        init_ust_event_notifier_from_event_rule(event_rule, &event_notifier);
        event_notifier.event.token = ua_event_notifier_rule->token;
+       event_notifier.error_counter_index = ua_event_notifier_rule->error_counter_index;
 
        /* Create UST event notifier against the tracer. */
        pthread_mutex_lock(&app->sock_lock);
@@ -3013,12 +3027,12 @@ error:
  *
  * Return 0 on success or else a negative value.
  */
-static int duplicate_channel_object(struct buffer_reg_channel *reg_chan,
+static int duplicate_channel_object(struct buffer_reg_channel *buf_reg_chan,
                struct ust_app_channel *ua_chan)
 {
        int ret;
 
-       assert(reg_chan);
+       assert(buf_reg_chan);
        assert(ua_chan);
 
        /* Need two fds for the channel. */
@@ -3029,10 +3043,10 @@ static int duplicate_channel_object(struct buffer_reg_channel *reg_chan,
        }
 
        /* Duplicate object for stream once the original is in the registry. */
-       ret = ustctl_duplicate_ust_object_data(&ua_chan->obj, reg_chan->obj.ust);
+       ret = ustctl_duplicate_ust_object_data(&ua_chan->obj, buf_reg_chan->obj.ust);
        if (ret < 0) {
                ERR("Duplicate channel obj from %p to %p failed with ret: %d",
-                               reg_chan->obj.ust, ua_chan->obj, ret);
+                               buf_reg_chan->obj.ust, ua_chan->obj, ret);
                goto error;
        }
        ua_chan->handle = ua_chan->obj->handle;
@@ -3051,14 +3065,14 @@ error_fd_get:
  *
  * Return 0 on success or else a negative value.
  */
-static int setup_buffer_reg_streams(struct buffer_reg_channel *reg_chan,
+static int setup_buffer_reg_streams(struct buffer_reg_channel *buf_reg_chan,
                struct ust_app_channel *ua_chan,
                struct ust_app *app)
 {
        int ret = 0;
        struct ust_app_stream *stream, *stmp;
 
-       assert(reg_chan);
+       assert(buf_reg_chan);
        assert(ua_chan);
 
        DBG2("UST app setup buffer registry stream");
@@ -3078,7 +3092,7 @@ static int setup_buffer_reg_streams(struct buffer_reg_channel *reg_chan,
                 */
                reg_stream->obj.ust = stream->obj;
                stream->obj = NULL;
-               buffer_reg_stream_add(reg_stream, reg_chan);
+               buffer_reg_stream_add(reg_stream, buf_reg_chan);
 
                /* We don't need the streams anymore. */
                cds_list_del(&stream->list);
@@ -3101,7 +3115,7 @@ static int create_buffer_reg_channel(struct buffer_reg_session *reg_sess,
                struct ust_app_channel *ua_chan, struct buffer_reg_channel **regp)
 {
        int ret;
-       struct buffer_reg_channel *reg_chan = NULL;
+       struct buffer_reg_channel *buf_reg_chan = NULL;
 
        assert(reg_sess);
        assert(ua_chan);
@@ -3109,14 +3123,14 @@ static int create_buffer_reg_channel(struct buffer_reg_session *reg_sess,
        DBG2("UST app creating buffer registry channel for %s", ua_chan->name);
 
        /* Create buffer registry channel. */
-       ret = buffer_reg_channel_create(ua_chan->tracing_channel_id, &reg_chan);
+       ret = buffer_reg_channel_create(ua_chan->tracing_channel_id, &buf_reg_chan);
        if (ret < 0) {
                goto error_create;
        }
-       assert(reg_chan);
-       reg_chan->consumer_key = ua_chan->key;
-       reg_chan->subbuf_size = ua_chan->attr.subbuf_size;
-       reg_chan->num_subbuf = ua_chan->attr.num_subbuf;
+       assert(buf_reg_chan);
+       buf_reg_chan->consumer_key = ua_chan->key;
+       buf_reg_chan->subbuf_size = ua_chan->attr.subbuf_size;
+       buf_reg_chan->num_subbuf = ua_chan->attr.num_subbuf;
 
        /* Create and add a channel registry to session. */
        ret = ust_registry_channel_add(reg_sess->reg.ust,
@@ -3124,17 +3138,17 @@ static int create_buffer_reg_channel(struct buffer_reg_session *reg_sess,
        if (ret < 0) {
                goto error;
        }
-       buffer_reg_channel_add(reg_sess, reg_chan);
+       buffer_reg_channel_add(reg_sess, buf_reg_chan);
 
        if (regp) {
-               *regp = reg_chan;
+               *regp = buf_reg_chan;
        }
 
        return 0;
 
 error:
        /* Safe because the registry channel object was not added to any HT. */
-       buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
+       buffer_reg_channel_destroy(buf_reg_chan, LTTNG_DOMAIN_UST);
 error_create:
        return ret;
 }
@@ -3146,32 +3160,32 @@ error_create:
  * Return 0 on success else a negative value.
  */
 static int setup_buffer_reg_channel(struct buffer_reg_session *reg_sess,
-               struct ust_app_channel *ua_chan, struct buffer_reg_channel *reg_chan,
+               struct ust_app_channel *ua_chan, struct buffer_reg_channel *buf_reg_chan,
                struct ust_app *app)
 {
        int ret;
 
        assert(reg_sess);
-       assert(reg_chan);
+       assert(buf_reg_chan);
        assert(ua_chan);
        assert(ua_chan->obj);
 
        DBG2("UST app setup buffer registry channel for %s", ua_chan->name);
 
        /* Setup all streams for the registry. */
-       ret = setup_buffer_reg_streams(reg_chan, ua_chan, app);
+       ret = setup_buffer_reg_streams(buf_reg_chan, ua_chan, app);
        if (ret < 0) {
                goto error;
        }
 
-       reg_chan->obj.ust = ua_chan->obj;
+       buf_reg_chan->obj.ust = ua_chan->obj;
        ua_chan->obj = NULL;
 
        return 0;
 
 error:
-       buffer_reg_channel_remove(reg_sess, reg_chan);
-       buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
+       buffer_reg_channel_remove(reg_sess, buf_reg_chan);
+       buffer_reg_channel_destroy(buf_reg_chan, LTTNG_DOMAIN_UST);
        return ret;
 }
 
@@ -3180,21 +3194,21 @@ error:
  *
  * Return 0 on success else a negative value.
  */
-static int send_channel_uid_to_ust(struct buffer_reg_channel *reg_chan,
+static int send_channel_uid_to_ust(struct buffer_reg_channel *buf_reg_chan,
                struct ust_app *app, struct ust_app_session *ua_sess,
                struct ust_app_channel *ua_chan)
 {
        int ret;
        struct buffer_reg_stream *reg_stream;
 
-       assert(reg_chan);
+       assert(buf_reg_chan);
        assert(app);
        assert(ua_sess);
        assert(ua_chan);
 
        DBG("UST app sending buffer registry channel to ust sock %d", app->sock);
 
-       ret = duplicate_channel_object(reg_chan, ua_chan);
+       ret = duplicate_channel_object(buf_reg_chan, ua_chan);
        if (ret < 0) {
                goto error;
        }
@@ -3211,8 +3225,8 @@ static int send_channel_uid_to_ust(struct buffer_reg_channel *reg_chan,
        health_code_update();
 
        /* Send all streams to application. */
-       pthread_mutex_lock(&reg_chan->stream_list_lock);
-       cds_list_for_each_entry(reg_stream, &reg_chan->streams, lnode) {
+       pthread_mutex_lock(&buf_reg_chan->stream_list_lock);
+       cds_list_for_each_entry(reg_stream, &buf_reg_chan->streams, lnode) {
                struct ust_app_stream stream;
 
                ret = duplicate_stream_object(reg_stream, &stream);
@@ -3238,7 +3252,7 @@ static int send_channel_uid_to_ust(struct buffer_reg_channel *reg_chan,
        ua_chan->is_sent = 1;
 
 error_stream_unlock:
-       pthread_mutex_unlock(&reg_chan->stream_list_lock);
+       pthread_mutex_unlock(&buf_reg_chan->stream_list_lock);
 error:
        return ret;
 }
@@ -3257,10 +3271,10 @@ static int create_channel_per_uid(struct ust_app *app,
 {
        int ret;
        struct buffer_reg_uid *reg_uid;
-       struct buffer_reg_channel *reg_chan;
+       struct buffer_reg_channel *buf_reg_chan;
        struct ltt_session *session = NULL;
        enum lttng_error_code notification_ret;
-       struct ust_registry_channel *chan_reg;
+       struct ust_registry_channel *ust_reg_chan;
 
        assert(app);
        assert(usess);
@@ -3277,14 +3291,14 @@ static int create_channel_per_uid(struct ust_app *app,
         */
        assert(reg_uid);
 
-       reg_chan = buffer_reg_channel_find(ua_chan->tracing_channel_id,
+       buf_reg_chan = buffer_reg_channel_find(ua_chan->tracing_channel_id,
                        reg_uid);
-       if (reg_chan) {
+       if (buf_reg_chan) {
                goto send_channel;
        }
 
        /* Create the buffer registry channel object. */
-       ret = create_buffer_reg_channel(reg_uid->registry, ua_chan, &reg_chan);
+       ret = create_buffer_reg_channel(reg_uid->registry, ua_chan, &buf_reg_chan);
        if (ret < 0) {
                ERR("Error creating the UST channel \"%s\" registry instance",
                                ua_chan->name);
@@ -3313,8 +3327,8 @@ static int create_channel_per_uid(struct ust_app *app,
                 */
                ust_registry_channel_del_free(reg_uid->registry->reg.ust,
                                ua_chan->tracing_channel_id, false);
-               buffer_reg_channel_remove(reg_uid->registry, reg_chan);
-               buffer_reg_channel_destroy(reg_chan, LTTNG_DOMAIN_UST);
+               buffer_reg_channel_remove(reg_uid->registry, buf_reg_chan);
+               buffer_reg_channel_destroy(buf_reg_chan, LTTNG_DOMAIN_UST);
                goto error;
        }
 
@@ -3322,7 +3336,7 @@ static int create_channel_per_uid(struct ust_app *app,
         * Setup the streams and add it to the session registry.
         */
        ret = setup_buffer_reg_channel(reg_uid->registry,
-                       ua_chan, reg_chan, app);
+                       ua_chan, buf_reg_chan, app);
        if (ret < 0) {
                ERR("Error setting up UST channel \"%s\"", ua_chan->name);
                goto error;
@@ -3330,19 +3344,20 @@ static int create_channel_per_uid(struct ust_app *app,
 
        /* Notify the notification subsystem of the channel's creation. */
        pthread_mutex_lock(&reg_uid->registry->reg.ust->lock);
-       chan_reg = ust_registry_channel_find(reg_uid->registry->reg.ust,
+       ust_reg_chan = ust_registry_channel_find(reg_uid->registry->reg.ust,
                        ua_chan->tracing_channel_id);
-       assert(chan_reg);
-       chan_reg->consumer_key = ua_chan->key;
-       chan_reg = NULL;
+       assert(ust_reg_chan);
+       ust_reg_chan->consumer_key = ua_chan->key;
+       ust_reg_chan = NULL;
        pthread_mutex_unlock(&reg_uid->registry->reg.ust->lock);
 
        notification_ret = notification_thread_command_add_channel(
-                       notification_thread_handle, session->name,
-                       lttng_credentials_get_uid(&ua_sess->effective_credentials),
-                       lttng_credentials_get_gid(&ua_sess->effective_credentials),
-                       ua_chan->name,
-                       ua_chan->key, LTTNG_DOMAIN_UST,
+                       the_notification_thread_handle, session->name,
+                       lttng_credentials_get_uid(
+                                       &ua_sess->effective_credentials),
+                       lttng_credentials_get_gid(
+                                       &ua_sess->effective_credentials),
+                       ua_chan->name, ua_chan->key, LTTNG_DOMAIN_UST,
                        ua_chan->attr.subbuf_size * ua_chan->attr.num_subbuf);
        if (notification_ret != LTTNG_OK) {
                ret = - (int) notification_ret;
@@ -3352,7 +3367,7 @@ static int create_channel_per_uid(struct ust_app *app,
 
 send_channel:
        /* Send buffers to the application. */
-       ret = send_channel_uid_to_ust(reg_chan, app, ua_sess, ua_chan);
+       ret = send_channel_uid_to_ust(buf_reg_chan, app, ua_sess, ua_chan);
        if (ret < 0) {
                if (ret != -ENOTCONN) {
                        ERR("Error sending channel to application");
@@ -3384,7 +3399,7 @@ static int create_channel_per_pid(struct ust_app *app,
        enum lttng_error_code cmd_ret;
        struct ltt_session *session = NULL;
        uint64_t chan_reg_key;
-       struct ust_registry_channel *chan_reg;
+       struct ust_registry_channel *ust_reg_chan;
 
        assert(app);
        assert(usess);
@@ -3433,17 +3448,18 @@ static int create_channel_per_pid(struct ust_app *app,
 
        chan_reg_key = ua_chan->key;
        pthread_mutex_lock(&registry->lock);
-       chan_reg = ust_registry_channel_find(registry, chan_reg_key);
-       assert(chan_reg);
-       chan_reg->consumer_key = ua_chan->key;
+       ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key);
+       assert(ust_reg_chan);
+       ust_reg_chan->consumer_key = ua_chan->key;
        pthread_mutex_unlock(&registry->lock);
 
        cmd_ret = notification_thread_command_add_channel(
-                       notification_thread_handle, session->name,
-                       lttng_credentials_get_uid(&ua_sess->effective_credentials),
-                       lttng_credentials_get_gid(&ua_sess->effective_credentials),
-                       ua_chan->name,
-                       ua_chan->key, LTTNG_DOMAIN_UST,
+                       the_notification_thread_handle, session->name,
+                       lttng_credentials_get_uid(
+                                       &ua_sess->effective_credentials),
+                       lttng_credentials_get_gid(
+                                       &ua_sess->effective_credentials),
+                       ua_chan->name, ua_chan->key, LTTNG_DOMAIN_UST,
                        ua_chan->attr.subbuf_size * ua_chan->attr.num_subbuf);
        if (cmd_ret != LTTNG_OK) {
                ret = - (int) cmd_ret;
@@ -3674,12 +3690,12 @@ int create_ust_app_event_notifier_rule(struct lttng_trigger *trigger,
        DBG2("UST app create token event rule completed: app = '%s' (ppid: %d), token = %" PRIu64,
                        app->name, app->ppid, lttng_trigger_get_tracer_token(trigger));
 
-end:
-       return ret;
+       goto end;
 
 error:
        /* The RCU read side lock is already being held by the caller. */
        delete_ust_app_event_notifier_rule(-1, ua_event_notifier_rule, app);
+end:
        return ret;
 }
 
@@ -3836,9 +3852,11 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock)
        DBG3("UST app creating application for socket %d", sock);
 
        if ((msg->bits_per_long == 64 &&
-                               (uatomic_read(&ust_consumerd64_fd) == -EINVAL))
-                       || (msg->bits_per_long == 32 &&
-                               (uatomic_read(&ust_consumerd32_fd) == -EINVAL))) {
+                           (uatomic_read(&the_ust_consumerd64_fd) ==
+                                           -EINVAL)) ||
+                       (msg->bits_per_long == 32 &&
+                                       (uatomic_read(&the_ust_consumerd32_fd) ==
+                                                       -EINVAL))) {
                ERR("Registration failed: application \"%s\" (pid: %d) has "
                                "%d-bit long, but no consumerd for this size is available.\n",
                                msg->name, msg->pid, msg->bits_per_long);
@@ -3994,6 +4012,7 @@ int ust_app_setup_event_notifier_group(struct ust_app *app)
        int event_pipe_write_fd;
        struct lttng_ust_abi_object_data *event_notifier_group = NULL;
        enum lttng_error_code lttng_ret;
+       enum event_notifier_error_accounting_status event_notifier_error_accounting_status;
 
        assert(app);
 
@@ -4031,8 +4050,9 @@ int ust_app_setup_event_notifier_group(struct ust_app *app)
        lttng_fd_put(LTTNG_FD_APPS, 1);
 
        lttng_ret = notification_thread_command_add_tracer_event_source(
-                       notification_thread_handle,
-                       lttng_pipe_get_readfd(app->event_notifier_group.event_pipe),
+                       the_notification_thread_handle,
+                       lttng_pipe_get_readfd(
+                                       app->event_notifier_group.event_pipe),
                        LTTNG_DOMAIN_UST);
        if (lttng_ret != LTTNG_OK) {
                ERR("Failed to add tracer event source to notification thread");
@@ -4042,11 +4062,20 @@ int ust_app_setup_event_notifier_group(struct ust_app *app)
 
        /* Assign handle only when the complete setup is valid. */
        app->event_notifier_group.object = event_notifier_group;
+
+       event_notifier_error_accounting_status = event_notifier_error_accounting_register_app(app);
+       if (event_notifier_error_accounting_status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
+               ERR("Failed to setup event notifier error accounting for app");
+               ret = -1;
+               goto error;
+       }
+
        return ret;
 
 error:
        ustctl_release_object(app->sock, app->event_notifier_group.object);
        free(app->event_notifier_group.object);
+       app->event_notifier_group.object = NULL;
        return ret;
 }
 
@@ -5192,7 +5221,7 @@ int ust_app_flush_session(struct ltt_ust_session *usess)
                /* Flush all per UID buffers associated to that session. */
                cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
                        struct ust_registry_session *ust_session_reg;
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
                        struct consumer_socket *socket;
 
                        /* Get consumer socket to use to push the metadata.*/
@@ -5204,13 +5233,13 @@ int ust_app_flush_session(struct ltt_ust_session *usess)
                        }
 
                        cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
-                                       reg_chan, node.node) {
+                                       buf_reg_chan, node.node) {
                                /*
                                 * The following call will print error values so the return
                                 * code is of little importance because whatever happens, we
                                 * have to try them all.
                                 */
-                               (void) consumer_flush_channel(socket, reg_chan->consumer_key);
+                               (void) consumer_flush_channel(socket, buf_reg_chan->consumer_key);
                        }
 
                        ust_session_reg = reg->registry->reg.ust;
@@ -5339,7 +5368,7 @@ int ust_app_clear_quiescent_session(struct ltt_ust_session *usess)
                 */
                cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
                        struct consumer_socket *socket;
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
 
                        /* Get associated consumer socket.*/
                        socket = consumer_find_socket_by_bitness(
@@ -5353,7 +5382,7 @@ int ust_app_clear_quiescent_session(struct ltt_ust_session *usess)
                        }
 
                        cds_lfht_for_each_entry(reg->registry->channels->ht,
-                                       &iter.iter, reg_chan, node.node) {
+                                       &iter.iter, buf_reg_chan, node.node) {
                                /*
                                 * The following call will print error values so
                                 * the return code is of little importance
@@ -5361,7 +5390,7 @@ int ust_app_clear_quiescent_session(struct ltt_ust_session *usess)
                                 * all.
                                 */
                                (void) consumer_clear_quiescent_channel(socket,
-                                               reg_chan->consumer_key);
+                                               buf_reg_chan->consumer_key);
                        }
                }
                break;
@@ -5622,7 +5651,7 @@ void ust_app_synchronize_event_notifier_rules(struct ust_app *app)
 
        /* Get all triggers using uid 0 (root) */
        ret_code = notification_thread_command_list_triggers(
-                       notification_thread_handle, 0, &triggers);
+                       the_notification_thread_handle, 0, &triggers);
        if (ret_code != LTTNG_OK) {
                ret = -1;
                goto end;
@@ -5735,38 +5764,20 @@ end:
 }
 
 /*
- * The caller must ensure that the application is compatible and is tracked
- * by the process attribute trackers.
+ * RCU read lock must be held by the caller.
  */
 static
-void ust_app_synchronize(struct ltt_ust_session *usess,
+void ust_app_synchronize_all_channels(struct ltt_ust_session *usess,
+               struct ust_app_session *ua_sess,
                struct ust_app *app)
 {
        int ret = 0;
        struct cds_lfht_iter uchan_iter;
        struct ltt_ust_channel *uchan;
-       struct ust_app_session *ua_sess = NULL;
-
-       /*
-        * The application's configuration should only be synchronized for
-        * active sessions.
-        */
-       assert(usess->active);
 
-       ret = find_or_create_ust_app_session(usess, app, &ua_sess, NULL);
-       if (ret < 0) {
-               /* Tracer is probably gone or ENOMEM. */
-               goto error;
-       }
+       assert(usess);
        assert(ua_sess);
-
-       pthread_mutex_lock(&ua_sess->lock);
-       if (ua_sess->deleted) {
-               pthread_mutex_unlock(&ua_sess->lock);
-               goto end;
-       }
-
-       rcu_read_lock();
+       assert(app);
 
        cds_lfht_for_each_entry(usess->domain_global.channels->ht, &uchan_iter,
                        uchan, node.node) {
@@ -5785,7 +5796,7 @@ void ust_app_synchronize(struct ltt_ust_session *usess,
                        app, uchan, &ua_chan);
                if (ret) {
                        /* Tracer is probably gone or ENOMEM. */
-                       goto error_unlock;
+                       goto end;
                }
 
                if (!ua_chan) {
@@ -5798,7 +5809,7 @@ void ust_app_synchronize(struct ltt_ust_session *usess,
                        ret = ust_app_channel_synchronize_event(ua_chan,
                                uevent, ua_sess, app);
                        if (ret) {
-                               goto error_unlock;
+                               goto end;
                        }
                }
 
@@ -5807,10 +5818,47 @@ void ust_app_synchronize(struct ltt_ust_session *usess,
                                enable_ust_app_channel(ua_sess, uchan, app) :
                                disable_ust_app_channel(ua_sess, ua_chan, app);
                        if (ret) {
-                               goto error_unlock;
+                               goto end;
                        }
                }
        }
+end:
+       return;
+}
+
+/*
+ * The caller must ensure that the application is compatible and is tracked
+ * by the process attribute trackers.
+ */
+static
+void ust_app_synchronize(struct ltt_ust_session *usess,
+               struct ust_app *app)
+{
+       int ret = 0;
+       struct ust_app_session *ua_sess = NULL;
+
+       /*
+        * The application's configuration should only be synchronized for
+        * active sessions.
+        */
+       assert(usess->active);
+
+       ret = find_or_create_ust_app_session(usess, app, &ua_sess, NULL);
+       if (ret < 0) {
+               /* Tracer is probably gone or ENOMEM. */
+               goto error;
+       }
+       assert(ua_sess);
+
+       pthread_mutex_lock(&ua_sess->lock);
+       if (ua_sess->deleted) {
+               pthread_mutex_unlock(&ua_sess->lock);
+               goto end;
+       }
+
+       rcu_read_lock();
+
+       ust_app_synchronize_all_channels(usess, ua_sess, app);
 
        /*
         * Create the metadata for the application. This returns gracefully if a
@@ -5943,6 +5991,20 @@ void ust_app_global_update_all_event_notifier_rules(void)
        rcu_read_unlock();
 }
 
+void ust_app_update_event_notifier_error_count(struct lttng_trigger *trigger)
+{
+       uint64_t error_count = 0;
+       enum event_notifier_error_accounting_status status;
+       struct lttng_condition *condition = lttng_trigger_get_condition(trigger);
+
+       status = event_notifier_error_accounting_get_count(trigger, &error_count);
+       if (status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
+               ERR("Error getting trigger error count.");
+       }
+
+       lttng_condition_on_event_set_error_count(condition, error_count);
+}
+
 /*
  * Add context to a specific channel for global UST domain.
  */
@@ -6121,7 +6183,7 @@ static int reply_ust_register_channel(int sock, int cobjd,
        struct ust_app_channel *ua_chan;
        struct ust_app_session *ua_sess;
        struct ust_registry_session *registry;
-       struct ust_registry_channel *chan_reg;
+       struct ust_registry_channel *ust_reg_chan;
 
        rcu_read_lock();
 
@@ -6162,30 +6224,30 @@ static int reply_ust_register_channel(int sock, int cobjd,
 
        pthread_mutex_lock(&registry->lock);
 
-       chan_reg = ust_registry_channel_find(registry, chan_reg_key);
-       assert(chan_reg);
+       ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key);
+       assert(ust_reg_chan);
 
-       if (!chan_reg->register_done) {
+       if (!ust_reg_chan->register_done) {
                /*
                 * TODO: eventually use the registry event count for
                 * this channel to better guess header type for per-pid
                 * buffers.
                 */
                type = USTCTL_CHANNEL_HEADER_LARGE;
-               chan_reg->nr_ctx_fields = nr_fields;
-               chan_reg->ctx_fields = fields;
+               ust_reg_chan->nr_ctx_fields = nr_fields;
+               ust_reg_chan->ctx_fields = fields;
                fields = NULL;
-               chan_reg->header_type = type;
+               ust_reg_chan->header_type = type;
        } else {
                /* Get current already assigned values. */
-               type = chan_reg->header_type;
+               type = ust_reg_chan->header_type;
        }
        /* Channel id is set during the object creation. */
-       chan_id = chan_reg->chan_id;
+       chan_id = ust_reg_chan->chan_id;
 
        /* Append to metadata */
-       if (!chan_reg->metadata_dumped) {
-               ret_code = ust_metadata_channel_statedump(registry, chan_reg);
+       if (!ust_reg_chan->metadata_dumped) {
+               ret_code = ust_metadata_channel_statedump(registry, ust_reg_chan);
                if (ret_code) {
                        ERR("Error appending channel metadata (errno = %d)", ret_code);
                        goto reply;
@@ -6208,7 +6270,7 @@ reply:
        }
 
        /* This channel registry registration is completed. */
-       chan_reg->register_done = 1;
+       ust_reg_chan->register_done = 1;
 
 error:
        pthread_mutex_unlock(&registry->lock);
@@ -6650,7 +6712,7 @@ enum lttng_error_code ust_app_snapshot_record(
                struct buffer_reg_uid *reg;
 
                cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
                        struct consumer_socket *socket;
                        char pathname[PATH_MAX];
                        size_t consumer_path_offset = 0;
@@ -6687,9 +6749,9 @@ enum lttng_error_code ust_app_snapshot_record(
                        }
                        /* Add the UST default trace dir to path. */
                        cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
-                                       reg_chan, node.node) {
+                                       buf_reg_chan, node.node) {
                                status = consumer_snapshot_channel(socket,
-                                               reg_chan->consumer_key,
+                                               buf_reg_chan->consumer_key,
                                                output, 0, usess->uid,
                                                usess->gid, &trace_path[consumer_path_offset], wait,
                                                nb_packets_per_stream);
@@ -6817,19 +6879,19 @@ uint64_t ust_app_get_size_one_more_packet_per_stream(
                struct buffer_reg_uid *reg;
 
                cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
 
                        rcu_read_lock();
                        cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
-                                       reg_chan, node.node) {
-                               if (cur_nr_packets >= reg_chan->num_subbuf) {
+                                       buf_reg_chan, node.node) {
+                               if (cur_nr_packets >= buf_reg_chan->num_subbuf) {
                                        /*
                                         * Don't take channel into account if we
                                         * already grab all its packets.
                                         */
                                        continue;
                                }
-                               tot_size += reg_chan->subbuf_size * reg_chan->stream_count;
+                               tot_size += buf_reg_chan->subbuf_size * buf_reg_chan->stream_count;
                        }
                        rcu_read_unlock();
                }
@@ -7053,7 +7115,7 @@ enum lttng_error_code ust_app_rotate_session(struct ltt_session *session)
                struct buffer_reg_uid *reg;
 
                cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
                        struct consumer_socket *socket;
 
                        if (!reg->registry->reg.ust->metadata_key) {
@@ -7071,9 +7133,9 @@ enum lttng_error_code ust_app_rotate_session(struct ltt_session *session)
 
                        /* Rotate the data channels. */
                        cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
-                                       reg_chan, node.node) {
+                                       buf_reg_chan, node.node) {
                                ret = consumer_rotate_channel(socket,
-                                               reg_chan->consumer_key,
+                                               buf_reg_chan->consumer_key,
                                                usess->uid, usess->gid,
                                                usess->consumer,
                                                /* is_metadata_channel */ false);
@@ -7310,7 +7372,7 @@ enum lttng_error_code ust_app_clear_session(struct ltt_session *session)
                struct buffer_reg_uid *reg;
 
                cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
                        struct consumer_socket *socket;
 
                        /* Get consumer socket to use to push the metadata.*/
@@ -7323,9 +7385,9 @@ enum lttng_error_code ust_app_clear_session(struct ltt_session *session)
 
                        /* Clear the data channels. */
                        cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
-                                       reg_chan, node.node) {
+                                       buf_reg_chan, node.node) {
                                ret = consumer_clear_channel(socket,
-                                               reg_chan->consumer_key);
+                                               buf_reg_chan->consumer_key);
                                if (ret < 0) {
                                        goto error;
                                }
@@ -7462,7 +7524,7 @@ enum lttng_error_code ust_app_open_packets(struct ltt_session *session)
 
                cds_list_for_each_entry (
                                reg, &usess->buffer_reg_uid_list, lnode) {
-                       struct buffer_reg_channel *reg_chan;
+                       struct buffer_reg_channel *buf_reg_chan;
                        struct consumer_socket *socket;
 
                        socket = consumer_find_socket_by_bitness(
@@ -7473,11 +7535,11 @@ enum lttng_error_code ust_app_open_packets(struct ltt_session *session)
                        }
 
                        cds_lfht_for_each_entry(reg->registry->channels->ht,
-                                       &iter.iter, reg_chan, node.node) {
+                                       &iter.iter, buf_reg_chan, node.node) {
                                const int open_ret =
                                                consumer_open_channel_packets(
                                                        socket,
-                                                       reg_chan->consumer_key);
+                                                       buf_reg_chan->consumer_key);
 
                                if (open_ret < 0) {
                                        ret = LTTNG_ERR_UNK;
This page took 0.036278 seconds and 4 git commands to generate.