Replace explicit rcu_read_lock/unlock with lttng::urcu::read_lock_guard
[lttng-tools.git] / src / bin / lttng-sessiond / event-notifier-error-accounting.cpp
index 93ecca853af7a4ecdf76f841f499d7a9072273a1..7fa54bc93080b54c361306ca3405b580f8b58f07 100644 (file)
@@ -14,6 +14,7 @@
 #include <common/index-allocator.hpp>
 #include <common/kernel-ctl/kernel-ctl.hpp>
 #include <common/shm.hpp>
+#include <common/urcu.hpp>
 
 #include <lttng/trigger/trigger-internal.hpp>
 
@@ -154,10 +155,9 @@ static void ust_error_accounting_entry_release(struct urcu_ref *entry_ref)
        struct ust_error_accounting_entry *entry =
                lttng::utils::container_of(entry_ref, &ust_error_accounting_entry::ref);
 
-       rcu_read_lock();
+       lttng::urcu::read_lock_guard read_lock;
        cds_lfht_del(error_counter_uid_ht->ht, &entry->node.node);
        call_rcu(&entry->rcu_head, free_ust_error_accounting_entry);
-       rcu_read_unlock();
 }
 
 static void ust_error_accounting_entry_put(struct ust_error_accounting_entry *entry)
@@ -172,37 +172,41 @@ static void ust_error_accounting_entry_put(struct ust_error_accounting_entry *en
 /*
  * Put one reference to every UID entries.
  */
-static void put_ref_all_ust_error_accounting_entry(void)
+static void put_ref_all_ust_error_accounting_entry()
 {
        struct lttng_ht_iter iter;
        struct ust_error_accounting_entry *uid_entry;
 
        ASSERT_LOCKED(the_event_notifier_counter.lock);
 
-       rcu_read_lock();
-       cds_lfht_for_each_entry (error_counter_uid_ht->ht, &iter.iter, uid_entry, node.node) {
-               ust_error_accounting_entry_put(uid_entry);
-       }
+       {
+               lttng::urcu::read_lock_guard read_lock;
 
-       rcu_read_unlock();
+               cds_lfht_for_each_entry (
+                       error_counter_uid_ht->ht, &iter.iter, uid_entry, node.node) {
+                       ust_error_accounting_entry_put(uid_entry);
+               }
+       }
 }
 
 /*
  * Get one reference to every UID entries.
  */
-static void get_ref_all_ust_error_accounting_entry(void)
+static void get_ref_all_ust_error_accounting_entry()
 {
        struct lttng_ht_iter iter;
        struct ust_error_accounting_entry *uid_entry;
 
        ASSERT_LOCKED(the_event_notifier_counter.lock);
 
-       rcu_read_lock();
-       cds_lfht_for_each_entry (error_counter_uid_ht->ht, &iter.iter, uid_entry, node.node) {
-               ust_error_accounting_entry_get(uid_entry);
-       }
+       {
+               lttng::urcu::read_lock_guard read_lock;
 
-       rcu_read_unlock();
+               cds_lfht_for_each_entry (
+                       error_counter_uid_ht->ht, &iter.iter, uid_entry, node.node) {
+                       ust_error_accounting_entry_get(uid_entry);
+               }
+       }
 }
 
 #endif /* HAVE_LIBLTTNG_UST_CTL */
@@ -235,7 +239,7 @@ init_error_accounting_state(struct error_accounting_state *state, uint64_t index
 
 error_indices_ht:
        lttng_index_allocator_destroy(state->index_allocator);
-       state->index_allocator = NULL;
+       state->index_allocator = nullptr;
 end:
        return status;
 }
@@ -300,8 +304,8 @@ static enum event_notifier_error_accounting_status get_error_counter_index_for_t
        struct lttng_ht_iter iter;
        const struct index_ht_entry *index_entry;
        enum event_notifier_error_accounting_status status;
+       lttng::urcu::read_lock_guard read_guard;
 
-       rcu_read_lock();
        lttng_ht_lookup(state->indices_ht, &tracer_token, &iter);
        node = lttng_ht_iter_get_node_u64(&iter);
        if (node) {
@@ -312,7 +316,6 @@ static enum event_notifier_error_accounting_status get_error_counter_index_for_t
                status = EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_NOT_FOUND;
        }
 
-       rcu_read_unlock();
        return status;
 }
 
@@ -331,8 +334,8 @@ static struct ust_error_accounting_entry *ust_error_accounting_entry_find(struct
 
        lttng_ht_lookup(uid_ht, &key, &iter);
        node = lttng_ht_iter_get_node_u64(&iter);
-       if (node == NULL) {
-               entry = NULL;
+       if (node == nullptr) {
+               entry = nullptr;
        } else {
                bool got_ref;
 
@@ -340,7 +343,7 @@ static struct ust_error_accounting_entry *ust_error_accounting_entry_find(struct
 
                got_ref = ust_error_accounting_entry_get(entry);
                if (!got_ref) {
-                       entry = NULL;
+                       entry = nullptr;
                }
        }
 
@@ -354,10 +357,10 @@ static struct ust_error_accounting_entry *ust_error_accounting_entry_find(struct
 static struct ust_error_accounting_entry *
 ust_error_accounting_entry_create(const struct ust_app *app)
 {
-       int i, ret, *cpu_counter_fds = NULL;
+       int i, ret, *cpu_counter_fds = nullptr;
        struct lttng_ust_ctl_daemon_counter *daemon_counter;
        struct lttng_ust_abi_object_data *counter, **cpu_counters;
-       struct ust_error_accounting_entry *entry = NULL;
+       struct ust_error_accounting_entry *entry = nullptr;
        lttng_ust_ctl_counter_dimension dimension = {};
 
        dimension.size = ust_state.number_indices;
@@ -508,7 +511,7 @@ error_counter_cpus_alloc:
 error_counter_cpu_fds_alloc:
        free(entry);
 error:
-       entry = NULL;
+       entry = nullptr;
 end:
        free(cpu_counter_fds);
        return entry;
@@ -591,6 +594,7 @@ event_notifier_error_accounting_register_app(struct ust_app *app)
        struct ust_error_accounting_entry *entry;
        enum event_notifier_error_accounting_status status;
        struct lttng_ust_abi_object_data **cpu_counters;
+       lttng::urcu::read_lock_guard read_lock;
 
        if (!ust_app_supports_counters(app)) {
                status = EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_UNSUPPORTED;
@@ -601,9 +605,8 @@ event_notifier_error_accounting_register_app(struct ust_app *app)
         * Check if we already have a error counter for the user id of this
         * app. If not, create one.
         */
-       rcu_read_lock();
        entry = ust_error_accounting_entry_find(error_counter_uid_ht, app);
-       if (entry == NULL) {
+       if (entry == nullptr) {
                /*
                 * Take the event notifier counter lock before creating the new
                 * entry to ensure that no event notifier is registered between
@@ -668,7 +671,7 @@ event_notifier_error_accounting_register_app(struct ust_app *app)
        }
 
        for (i = 0; i < entry->nr_counter_cpu_fds; i++) {
-               struct lttng_ust_abi_object_data *new_counter_cpu = NULL;
+               struct lttng_ust_abi_object_data *new_counter_cpu = nullptr;
 
                ret = lttng_ust_ctl_duplicate_ust_object_data(&new_counter_cpu,
                                                              entry->cpu_counters[i]);
@@ -700,11 +703,11 @@ event_notifier_error_accounting_register_app(struct ust_app *app)
        }
 
        app->event_notifier_group.counter = new_counter;
-       new_counter = NULL;
+       new_counter = nullptr;
        app->event_notifier_group.nr_counter_cpu = entry->nr_counter_cpu_fds;
        app->event_notifier_group.counter_cpu = cpu_counters;
-       cpu_counters = NULL;
-       goto end_unlock;
+       cpu_counters = nullptr;
+       goto end;
 
 error_send_cpu_counter_data:
 error_duplicate_cpu_counter:
@@ -731,9 +734,7 @@ error_send_counter_data:
 error_duplicate_counter:
        ust_error_accounting_entry_put(entry);
 error_creating_entry:
-       app->event_notifier_group.counter = NULL;
-end_unlock:
-       rcu_read_unlock();
+       app->event_notifier_group.counter = nullptr;
 end:
        return status;
 }
@@ -745,7 +746,7 @@ event_notifier_error_accounting_unregister_app(struct ust_app *app)
        struct ust_error_accounting_entry *entry;
        int i;
 
-       rcu_read_lock();
+       lttng::urcu::read_lock_guard read_lock;
 
        /* If an error occurred during app registration no entry was created. */
        if (!app->event_notifier_group.counter) {
@@ -754,7 +755,7 @@ event_notifier_error_accounting_unregister_app(struct ust_app *app)
        }
 
        entry = ust_error_accounting_entry_find(error_counter_uid_ht, app);
-       if (entry == NULL) {
+       if (entry == nullptr) {
                ERR("Failed to find event notitifier error accounting entry on application teardown: pid = %d, application name = '%s'",
                    app->pid,
                    app->name);
@@ -781,7 +782,6 @@ event_notifier_error_accounting_unregister_app(struct ust_app *app)
 
        status = EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK;
 end:
-       rcu_read_unlock();
        return status;
 }
 
@@ -797,7 +797,7 @@ event_notifier_error_accounting_ust_get_count(const struct lttng_trigger *trigge
        uid_t trigger_owner_uid;
        const char *trigger_name;
 
-       rcu_read_lock();
+       lttng::urcu::read_lock_guard read_lock;
 
        get_trigger_info_for_log(trigger, &trigger_name, &trigger_owner_uid);
 
@@ -857,7 +857,6 @@ event_notifier_error_accounting_ust_get_count(const struct lttng_trigger *trigge
        status = EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK;
 
 end:
-       rcu_read_unlock();
        return status;
 }
 
@@ -871,7 +870,8 @@ event_notifier_error_accounting_ust_clear(const struct lttng_trigger *trigger)
        size_t dimension_index;
        const uint64_t tracer_token = lttng_trigger_get_tracer_token(trigger);
 
-       rcu_read_lock();
+       lttng::urcu::read_lock_guard read_lock;
+
        status = get_error_counter_index_for_token(&ust_state, tracer_token, &error_counter_index);
        if (status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
                uid_t trigger_owner_uid;
@@ -915,7 +915,6 @@ event_notifier_error_accounting_ust_clear(const struct lttng_trigger *trigger)
 
        status = EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK;
 end:
-       rcu_read_unlock();
        return status;
 }
 #endif /* HAVE_LIBLTTNG_UST_CTL */
@@ -1042,7 +1041,7 @@ static enum event_notifier_error_accounting_status create_error_counter_index_fo
        }
 
        index_entry = zmalloc<index_ht_entry>();
-       if (index_entry == NULL) {
+       if (index_entry == nullptr) {
                PERROR("Failed to allocate event notifier error counter hash table entry");
                status = EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_NOMEM;
                goto end;
@@ -1262,6 +1261,8 @@ void event_notifier_error_accounting_unregister_event_notifier(const struct lttn
        enum event_notifier_error_accounting_status status;
        struct error_accounting_state *state;
 
+       lttng::urcu::read_lock_guard read_lock;
+
        status = event_notifier_error_accounting_clear(trigger);
        if (status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) {
                /* Trigger details already logged by callee on error. */
@@ -1270,8 +1271,6 @@ void event_notifier_error_accounting_unregister_event_notifier(const struct lttn
                goto end;
        }
 
-       rcu_read_lock();
-
        switch (lttng_trigger_get_underlying_domain_type_restriction(trigger)) {
        case LTTNG_DOMAIN_KERNEL:
                state = &kernel_state;
@@ -1330,12 +1329,11 @@ void event_notifier_error_accounting_unregister_event_notifier(const struct lttn
                LTTNG_ASSERT(!del_ret);
                call_rcu(&index_entry->rcu_head, free_index_ht_entry);
        }
-
 end:
-       rcu_read_unlock();
+       return;
 }
 
-void event_notifier_error_accounting_fini(void)
+void event_notifier_error_accounting_fini()
 {
        if (kernel_error_accounting_entry.error_counter_fd) {
                const int ret = close(kernel_error_accounting_entry.error_counter_fd);
This page took 0.027021 seconds and 4 git commands to generate.