Fix: syscall event rule: emission sites not compared in is_equal
[lttng-tools.git] / src / common / trace-chunk.cpp
index f38a93b90930b3abd357574a34f009d1807f17b1..5da16a6134ac7027365a022abb27410bec2edf1f 100644 (file)
@@ -21,6 +21,7 @@
 #include <common/time.hpp>
 #include <common/trace-chunk-registry.hpp>
 #include <common/trace-chunk.hpp>
+#include <common/urcu.hpp>
 #include <common/utils.hpp>
 
 #include <lttng/constant.h>
@@ -188,7 +189,7 @@ static struct fs_handle *fs_handle_untracked_create(struct lttng_directory_handl
                                                    const char *path,
                                                    int fd)
 {
-       struct fs_handle_untracked *handle = NULL;
+       struct fs_handle_untracked *handle = nullptr;
        bool reference_acquired;
        char *path_copy = strdup(path);
 
@@ -217,10 +218,10 @@ static struct fs_handle *fs_handle_untracked_create(struct lttng_directory_handl
        handle->location.directory_handle = directory_handle;
        /* Ownership is transferred. */
        handle->location.path = path_copy;
-       path_copy = NULL;
+       path_copy = nullptr;
 end:
        free(path_copy);
-       return handle ? &handle->parent : NULL;
+       return handle ? &handle->parent : nullptr;
 }
 
 static int fs_handle_untracked_get_fd(struct fs_handle *_handle)
@@ -305,7 +306,7 @@ static char *
 generate_chunk_name(uint64_t chunk_id, time_t creation_timestamp, const time_t *close_timestamp)
 {
        int ret = 0;
-       char *new_name = NULL;
+       char *new_name = nullptr;
        char start_datetime[ISO8601_STR_LEN] = {};
        /* Add 1 for a '-' prefix. */
        char end_datetime_suffix[ISO8601_STR_LEN + 1] = {};
@@ -343,13 +344,13 @@ generate_chunk_name(uint64_t chunk_id, time_t creation_timestamp, const time_t *
        return new_name;
 error:
        free(new_name);
-       return NULL;
+       return nullptr;
 }
 
 static void lttng_trace_chunk_init(struct lttng_trace_chunk *chunk)
 {
        urcu_ref_init(&chunk->ref);
-       pthread_mutex_init(&chunk->lock, NULL);
+       pthread_mutex_init(&chunk->lock, nullptr);
        lttng_dynamic_pointer_array_init(&chunk->top_level_directories, free);
        lttng_dynamic_pointer_array_init(&chunk->files, free);
 }
@@ -358,24 +359,24 @@ static void lttng_trace_chunk_fini(struct lttng_trace_chunk *chunk)
 {
        if (chunk->session_output_directory) {
                lttng_directory_handle_put(chunk->session_output_directory);
-               chunk->session_output_directory = NULL;
+               chunk->session_output_directory = nullptr;
        }
        if (chunk->chunk_directory) {
                lttng_directory_handle_put(chunk->chunk_directory);
-               chunk->chunk_directory = NULL;
+               chunk->chunk_directory = nullptr;
        }
        free(chunk->name);
-       chunk->name = NULL;
+       chunk->name = nullptr;
        free(chunk->path);
-       chunk->path = NULL;
+       chunk->path = nullptr;
        lttng_dynamic_pointer_array_reset(&chunk->top_level_directories);
        lttng_dynamic_pointer_array_reset(&chunk->files);
        pthread_mutex_destroy(&chunk->lock);
 }
 
-static struct lttng_trace_chunk *lttng_trace_chunk_allocate(void)
+static struct lttng_trace_chunk *lttng_trace_chunk_allocate()
 {
-       struct lttng_trace_chunk *chunk = NULL;
+       struct lttng_trace_chunk *chunk = nullptr;
 
        chunk = zmalloc<lttng_trace_chunk>();
        if (!chunk) {
@@ -387,7 +388,7 @@ end:
        return chunk;
 }
 
-struct lttng_trace_chunk *lttng_trace_chunk_create_anonymous(void)
+struct lttng_trace_chunk *lttng_trace_chunk_create_anonymous()
 {
        DBG("Creating anonymous trace chunk");
        return lttng_trace_chunk_allocate();
@@ -426,7 +427,7 @@ lttng_trace_chunk_create(uint64_t chunk_id, time_t chunk_creation_time, const ch
        LTTNG_OPTIONAL_SET(&chunk->id, chunk_id);
        LTTNG_OPTIONAL_SET(&chunk->timestamp_creation, chunk_creation_time);
        if (chunk_id != 0) {
-               chunk->name = generate_chunk_name(chunk_id, chunk_creation_time, NULL);
+               chunk->name = generate_chunk_name(chunk_id, chunk_creation_time, nullptr);
                if (!chunk->name) {
                        ERR("Failed to allocate trace chunk name storage");
                        goto error;
@@ -451,7 +452,7 @@ end:
        return chunk;
 error:
        lttng_trace_chunk_put(chunk);
-       return NULL;
+       return nullptr;
 }
 
 void lttng_trace_chunk_set_fd_tracker(struct lttng_trace_chunk *chunk,
@@ -526,7 +527,7 @@ end:
 error_unlock:
        pthread_mutex_unlock(&source_chunk->lock);
        lttng_trace_chunk_put(new_chunk);
-       return NULL;
+       return nullptr;
 }
 
 enum lttng_trace_chunk_status lttng_trace_chunk_get_id(struct lttng_trace_chunk *chunk,
@@ -718,7 +719,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
 
 {
        enum lttng_trace_chunk_status status = LTTNG_TRACE_CHUNK_STATUS_OK;
-       struct lttng_directory_handle *rename_directory = NULL;
+       struct lttng_directory_handle *rename_directory = nullptr;
        char *new_path, *old_path;
        int ret;
 
@@ -763,7 +764,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                        chunk->session_output_directory,
                        path,
                        LTTNG_OPTIONAL_GET(chunk->credentials).use_current_user ?
-                               NULL :
+                               nullptr :
                                &chunk->credentials.value.user);
                if (ret) {
                        PERROR("Failed to move trace chunk directory \"%s\" to \"%s\"",
@@ -790,7 +791,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                 * handle.
                 */
                chunk->chunk_directory = rename_directory;
-               rename_directory = NULL;
+               rename_directory = nullptr;
        } else if (old_path && old_path[0] == '\0') {
                size_t i,
                        count = lttng_dynamic_pointer_array_get_count(
@@ -801,7 +802,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                        path,
                        DIR_CREATION_MODE,
                        LTTNG_OPTIONAL_GET(chunk->credentials).use_current_user ?
-                               NULL :
+                               nullptr :
                                &chunk->credentials.value.user);
                if (ret) {
                        PERROR("Failed to create trace chunk rename directory \"%s\"", path);
@@ -829,7 +830,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                                rename_directory,
                                top_level_name,
                                LTTNG_OPTIONAL_GET(chunk->credentials).use_current_user ?
-                                       NULL :
+                                       nullptr :
                                        &chunk->credentials.value.user);
                        if (ret) {
                                PERROR("Failed to move \"%s\" to trace chunk rename directory",
@@ -845,7 +846,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                 * handle.
                 */
                chunk->chunk_directory = rename_directory;
-               rename_directory = NULL;
+               rename_directory = nullptr;
        } else if (old_path) {
                size_t i,
                        count = lttng_dynamic_pointer_array_get_count(
@@ -868,7 +869,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                                rename_directory,
                                top_level_name,
                                LTTNG_OPTIONAL_GET(chunk->credentials).use_current_user ?
-                                       NULL :
+                                       nullptr :
                                        &chunk->credentials.value.user);
                        if (ret) {
                                PERROR("Failed to move \"%s\" to trace chunk rename directory",
@@ -884,7 +885,7 @@ lttng_trace_chunk_rename_path_no_lock(struct lttng_trace_chunk *chunk, const cha
                 * handle.
                 */
                chunk->chunk_directory = rename_directory;
-               rename_directory = NULL;
+               rename_directory = nullptr;
 
                /* Remove old directory. */
                status = (lttng_trace_chunk_status) lttng_directory_handle_remove_subdirectory(
@@ -994,7 +995,7 @@ lttng_trace_chunk_set_as_owner(struct lttng_trace_chunk *chunk,
 {
        int ret;
        enum lttng_trace_chunk_status status = LTTNG_TRACE_CHUNK_STATUS_OK;
-       struct lttng_directory_handle *chunk_directory_handle = NULL;
+       struct lttng_directory_handle *chunk_directory_handle = nullptr;
        bool reference_acquired;
 
        pthread_mutex_lock(&chunk->lock);
@@ -1018,7 +1019,7 @@ lttng_trace_chunk_set_as_owner(struct lttng_trace_chunk *chunk,
                        DIR_CREATION_MODE,
                        !chunk->credentials.value.use_current_user ?
                                &chunk->credentials.value.user :
-                               NULL);
+                               nullptr);
                if (ret) {
                        PERROR("Failed to create chunk output directory \"%s\"", chunk->path);
                        status = LTTNG_TRACE_CHUNK_STATUS_ERROR;
@@ -1045,7 +1046,7 @@ lttng_trace_chunk_set_as_owner(struct lttng_trace_chunk *chunk,
                chunk_directory_handle = session_output_directory;
        }
        chunk->chunk_directory = chunk_directory_handle;
-       chunk_directory_handle = NULL;
+       chunk_directory_handle = nullptr;
        reference_acquired = lttng_directory_handle_get(session_output_directory);
        LTTNG_ASSERT(reference_acquired);
        chunk->session_output_directory = session_output_directory;
@@ -1090,7 +1091,7 @@ lttng_trace_chunk_get_session_output_directory_handle(struct lttng_trace_chunk *
        pthread_mutex_lock(&chunk->lock);
        if (!chunk->session_output_directory) {
                status = LTTNG_TRACE_CHUNK_STATUS_NONE;
-               *handle = NULL;
+               *handle = nullptr;
                goto end;
        } else {
                const bool reference_acquired =
@@ -1207,7 +1208,8 @@ enum lttng_trace_chunk_status lttng_trace_chunk_create_subdirectory(struct lttng
                chunk->chunk_directory,
                path,
                DIR_CREATION_MODE,
-               chunk->credentials.value.use_current_user ? NULL : &chunk->credentials.value.user);
+               chunk->credentials.value.use_current_user ? nullptr :
+                                                           &chunk->credentials.value.user);
        if (ret) {
                PERROR("Failed to create trace chunk subdirectory \"%s\"", path);
                status = LTTNG_TRACE_CHUNK_STATUS_ERROR;
@@ -1252,7 +1254,7 @@ static enum lttng_trace_chunk_status lttng_trace_chunk_add_file(struct lttng_tra
        int ret;
        enum lttng_trace_chunk_status status = LTTNG_TRACE_CHUNK_STATUS_OK;
 
-       if (lttng_trace_chunk_find_file(chunk, path, NULL)) {
+       if (lttng_trace_chunk_find_file(chunk, path, nullptr)) {
                return LTTNG_TRACE_CHUNK_STATUS_OK;
        }
        DBG("Adding new file \"%s\" to trace chunk \"%s\"", path, chunk->name ?: "(unnamed)");
@@ -1330,7 +1332,7 @@ _lttng_trace_chunk_open_fs_handle_locked(struct lttng_trace_chunk *chunk,
                        file_path,
                        flags,
                        mode,
-                       chunk->credentials.value.use_current_user ? NULL :
+                       chunk->credentials.value.use_current_user ? nullptr :
                                                                    &chunk->credentials.value.user);
                if (ret >= 0) {
                        *out_handle =
@@ -1429,10 +1431,11 @@ int lttng_trace_chunk_unlink_file(struct lttng_trace_chunk *chunk, const char *f
                status = LTTNG_TRACE_CHUNK_STATUS_ERROR;
                goto end;
        }
-       ret = lttng_directory_handle_unlink_file_as_user(
-               chunk->chunk_directory,
-               file_path,
-               chunk->credentials.value.use_current_user ? NULL : &chunk->credentials.value.user);
+       ret = lttng_directory_handle_unlink_file_as_user(chunk->chunk_directory,
+                                                        file_path,
+                                                        chunk->credentials.value.use_current_user ?
+                                                                nullptr :
+                                                                &chunk->credentials.value.user);
        if (ret < 0) {
                status = LTTNG_TRACE_CHUNK_STATUS_ERROR;
                goto end;
@@ -1470,7 +1473,8 @@ static int lttng_trace_chunk_remove_subdirectory_recursive(struct lttng_trace_ch
        ret = lttng_directory_handle_remove_subdirectory_recursive_as_user(
                chunk->chunk_directory,
                path,
-               chunk->credentials.value.use_current_user ? NULL : &chunk->credentials.value.user,
+               chunk->credentials.value.use_current_user ? nullptr :
+                                                           &chunk->credentials.value.user,
                LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG);
        if (ret < 0) {
                status = LTTNG_TRACE_CHUNK_STATUS_ERROR;
@@ -1484,11 +1488,11 @@ end:
 static int lttng_trace_chunk_move_to_completed_post_release(struct lttng_trace_chunk *trace_chunk)
 {
        int ret = 0;
-       char *archived_chunk_name = NULL;
+       char *archived_chunk_name = nullptr;
        const uint64_t chunk_id = LTTNG_OPTIONAL_GET(trace_chunk->id);
        const time_t creation_timestamp = LTTNG_OPTIONAL_GET(trace_chunk->timestamp_creation);
        const time_t close_timestamp = LTTNG_OPTIONAL_GET(trace_chunk->timestamp_close);
-       struct lttng_directory_handle *archived_chunks_directory = NULL;
+       struct lttng_directory_handle *archived_chunks_directory = nullptr;
        enum lttng_trace_chunk_status status;
 
        if (!trace_chunk->mode.is_set || trace_chunk->mode.value != TRACE_CHUNK_MODE_OWNER ||
@@ -1517,7 +1521,7 @@ static int lttng_trace_chunk_move_to_completed_post_release(struct lttng_trace_c
                DIR_CREATION_MODE,
                !trace_chunk->credentials.value.use_current_user ?
                        &trace_chunk->credentials.value.user :
-                       NULL);
+                       nullptr);
        if (ret) {
                PERROR("Failed to create \"" DEFAULT_ARCHIVED_TRACE_CHUNKS_DIRECTORY
                       "\" directory for archived trace chunks");
@@ -1542,7 +1546,7 @@ static int lttng_trace_chunk_move_to_completed_post_release(struct lttng_trace_c
         * the creation of the next chunk. This happens if a rotation is
         * performed while tracing is stopped.
         */
-       if (!trace_chunk->path || strcmp(trace_chunk->path, DEFAULT_CHUNK_TMP_OLD_DIRECTORY)) {
+       if (!trace_chunk->path || strcmp(trace_chunk->path, DEFAULT_CHUNK_TMP_OLD_DIRECTORY) != 0) {
                status = lttng_trace_chunk_rename_path_no_lock(trace_chunk,
                                                               DEFAULT_CHUNK_TMP_OLD_DIRECTORY);
                if (status != LTTNG_TRACE_CHUNK_STATUS_OK) {
@@ -1558,7 +1562,7 @@ static int lttng_trace_chunk_move_to_completed_post_release(struct lttng_trace_c
                archived_chunks_directory,
                archived_chunk_name,
                LTTNG_OPTIONAL_GET(trace_chunk->credentials).use_current_user ?
-                       NULL :
+                       nullptr :
                        &trace_chunk->credentials.value.user);
        if (ret) {
                PERROR("Failed to rename folder \"%s\" to \"%s\"",
@@ -1639,7 +1643,7 @@ static int lttng_trace_chunk_delete_post_release_owner(struct lttng_trace_chunk
        }
        if (!ret) {
                lttng_directory_handle_put(trace_chunk->chunk_directory);
-               trace_chunk->chunk_directory = NULL;
+               trace_chunk->chunk_directory = nullptr;
 
                if (trace_chunk->path && trace_chunk->path[0] != '\0') {
                        status = (lttng_trace_chunk_status)
@@ -1653,7 +1657,7 @@ static int lttng_trace_chunk_delete_post_release_owner(struct lttng_trace_chunk
                }
        }
        free(trace_chunk->path);
-       trace_chunk->path = NULL;
+       trace_chunk->path = nullptr;
 end:
        return ret;
 }
@@ -1824,9 +1828,8 @@ static void lttng_trace_chunk_release(struct urcu_ref *ref)
                element = lttng::utils::container_of(chunk,
                                                     &lttng_trace_chunk_registry_element::chunk);
                if (element->registry) {
-                       rcu_read_lock();
+                       lttng::urcu::read_lock_guard read_lock;
                        cds_lfht_del(element->registry->ht, &element->trace_chunk_registry_ht_node);
-                       rcu_read_unlock();
                        call_rcu(&element->rcu_node, free_lttng_trace_chunk_registry_element);
                } else {
                        /* Never published, can be free'd immediately. */
@@ -1848,7 +1851,7 @@ void lttng_trace_chunk_put(struct lttng_trace_chunk *chunk)
        urcu_ref_put(&chunk->ref, lttng_trace_chunk_release);
 }
 
-struct lttng_trace_chunk_registry *lttng_trace_chunk_registry_create(void)
+struct lttng_trace_chunk_registry *lttng_trace_chunk_registry_create()
 {
        struct lttng_trace_chunk_registry *registry;
 
@@ -1858,7 +1861,7 @@ struct lttng_trace_chunk_registry *lttng_trace_chunk_registry_create(void)
        }
 
        registry->ht = cds_lfht_new(
-               DEFAULT_HT_SIZE, 1, 0, CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, NULL);
+               DEFAULT_HT_SIZE, 1, 0, CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, nullptr);
        if (!registry->ht) {
                goto error;
        }
@@ -1866,7 +1869,7 @@ end:
        return registry;
 error:
        lttng_trace_chunk_registry_destroy(registry);
-       return NULL;
+       return nullptr;
 }
 
 void lttng_trace_chunk_registry_destroy(struct lttng_trace_chunk_registry *registry)
@@ -1875,7 +1878,7 @@ void lttng_trace_chunk_registry_destroy(struct lttng_trace_chunk_registry *regis
                return;
        }
        if (registry->ht) {
-               int ret = cds_lfht_destroy(registry->ht, NULL);
+               int ret = cds_lfht_destroy(registry->ht, nullptr);
                LTTNG_ASSERT(!ret);
        }
        free(registry);
@@ -1899,19 +1902,19 @@ lttng_trace_chunk_registry_element_create_from_chunk(struct lttng_trace_chunk *c
        if (chunk->session_output_directory) {
                /* Transferred ownership. */
                element->chunk.session_output_directory = chunk->session_output_directory;
-               chunk->session_output_directory = NULL;
+               chunk->session_output_directory = nullptr;
        }
        if (chunk->chunk_directory) {
                /* Transferred ownership. */
                element->chunk.chunk_directory = chunk->chunk_directory;
-               chunk->chunk_directory = NULL;
+               chunk->chunk_directory = nullptr;
        }
        /*
         * The original chunk becomes invalid; the name and path attributes are
         * transferred to the new chunk instance.
         */
-       chunk->name = NULL;
-       chunk->path = NULL;
+       chunk->name = nullptr;
+       chunk->path = nullptr;
        element->chunk.fd_tracker = chunk->fd_tracker;
        element->chunk.in_registry_element = true;
 end:
@@ -1940,6 +1943,8 @@ lttng_trace_chunk_registry_publish_chunk(struct lttng_trace_chunk_registry *regi
        pthread_mutex_lock(&chunk->lock);
        element = lttng_trace_chunk_registry_element_create_from_chunk(chunk, session_id);
        pthread_mutex_unlock(&chunk->lock);
+
+       lttng::urcu::read_lock_guard read_lock;
        if (!element) {
                goto end;
        }
@@ -1947,11 +1952,10 @@ lttng_trace_chunk_registry_publish_chunk(struct lttng_trace_chunk_registry *regi
         * chunk is now invalid, the only valid operation is a 'put' from the
         * caller.
         */
-       chunk = NULL;
+       chunk = nullptr;
        element_hash = lttng_trace_chunk_registry_element_hash(element);
 
-       rcu_read_lock();
-       while (1) {
+       while (true) {
                struct cds_lfht_node *published_node;
                struct lttng_trace_chunk *published_chunk;
                struct lttng_trace_chunk_registry_element *published_element;
@@ -2002,9 +2006,8 @@ lttng_trace_chunk_registry_publish_chunk(struct lttng_trace_chunk_registry *regi
                 * chunk.
                 */
        }
-       rcu_read_unlock();
 end:
-       return element ? &element->chunk : NULL;
+       return element ? &element->chunk : nullptr;
 }
 
 /*
@@ -2028,10 +2031,10 @@ static struct lttng_trace_chunk *_lttng_trace_chunk_registry_find_chunk(
        const unsigned long element_hash = lttng_trace_chunk_registry_element_hash(&target_element);
        struct cds_lfht_node *published_node;
        struct lttng_trace_chunk_registry_element *published_element;
-       struct lttng_trace_chunk *published_chunk = NULL;
+       struct lttng_trace_chunk *published_chunk = nullptr;
        struct cds_lfht_iter iter;
 
-       rcu_read_lock();
+       lttng::urcu::read_lock_guard read_lock;
        cds_lfht_lookup(registry->ht,
                        element_hash,
                        lttng_trace_chunk_registry_element_match,
@@ -2048,7 +2051,6 @@ static struct lttng_trace_chunk *_lttng_trace_chunk_registry_find_chunk(
                published_chunk = &published_element->chunk;
        }
 end:
-       rcu_read_unlock();
        return published_chunk;
 }
 
@@ -2074,7 +2076,7 @@ int lttng_trace_chunk_registry_chunk_exists(const struct lttng_trace_chunk_regis
        struct cds_lfht_node *published_node;
        struct cds_lfht_iter iter;
 
-       rcu_read_lock();
+       lttng::urcu::read_lock_guard read_lock;
        cds_lfht_lookup(registry->ht,
                        element_hash,
                        lttng_trace_chunk_registry_element_match,
@@ -2088,7 +2090,6 @@ int lttng_trace_chunk_registry_chunk_exists(const struct lttng_trace_chunk_regis
 
        *chunk_exists = !cds_lfht_is_node_deleted(published_node);
 end:
-       rcu_read_unlock();
        return ret;
 }
 
@@ -2096,7 +2097,7 @@ struct lttng_trace_chunk *
 lttng_trace_chunk_registry_find_anonymous_chunk(const struct lttng_trace_chunk_registry *registry,
                                                uint64_t session_id)
 {
-       return _lttng_trace_chunk_registry_find_chunk(registry, session_id, NULL);
+       return _lttng_trace_chunk_registry_find_chunk(registry, session_id, nullptr);
 }
 
 unsigned int
@@ -2107,37 +2108,42 @@ lttng_trace_chunk_registry_put_each_chunk(const struct lttng_trace_chunk_registr
        unsigned int trace_chunks_left = 0;
 
        DBG("Releasing trace chunk registry to all trace chunks");
-       rcu_read_lock();
-       cds_lfht_for_each_entry (registry->ht, &iter, chunk_element, trace_chunk_registry_ht_node) {
-               const char *chunk_id_str = "none";
-               char chunk_id_buf[MAX_INT_DEC_LEN(uint64_t)];
-
-               pthread_mutex_lock(&chunk_element->chunk.lock);
-               if (chunk_element->chunk.id.is_set) {
-                       int fmt_ret;
-
-                       fmt_ret = snprintf(chunk_id_buf,
-                                          sizeof(chunk_id_buf),
-                                          "%" PRIu64,
-                                          chunk_element->chunk.id.value);
-                       if (fmt_ret < 0 || fmt_ret >= sizeof(chunk_id_buf)) {
-                               chunk_id_str = "formatting error";
-                       } else {
-                               chunk_id_str = chunk_id_buf;
+
+       {
+               lttng::urcu::read_lock_guard read_lock;
+
+               cds_lfht_for_each_entry (
+                       registry->ht, &iter, chunk_element, trace_chunk_registry_ht_node) {
+                       const char *chunk_id_str = "none";
+                       char chunk_id_buf[MAX_INT_DEC_LEN(uint64_t)];
+
+                       pthread_mutex_lock(&chunk_element->chunk.lock);
+                       if (chunk_element->chunk.id.is_set) {
+                               int fmt_ret;
+
+                               fmt_ret = snprintf(chunk_id_buf,
+                                                  sizeof(chunk_id_buf),
+                                                  "%" PRIu64,
+                                                  chunk_element->chunk.id.value);
+                               if (fmt_ret < 0 || fmt_ret >= sizeof(chunk_id_buf)) {
+                                       chunk_id_str = "formatting error";
+                               } else {
+                                       chunk_id_str = chunk_id_buf;
+                               }
                        }
+
+                       DBG("Releasing reference to trace chunk: session_id = %" PRIu64
+                           "chunk_id = %s, name = \"%s\", status = %s",
+                           chunk_element->session_id,
+                           chunk_id_str,
+                           chunk_element->chunk.name ?: "none",
+                           chunk_element->chunk.close_command.is_set ? "open" : "closed");
+                       pthread_mutex_unlock(&chunk_element->chunk.lock);
+                       lttng_trace_chunk_put(&chunk_element->chunk);
+                       trace_chunks_left++;
                }
+       }
 
-               DBG("Releasing reference to trace chunk: session_id = %" PRIu64
-                   "chunk_id = %s, name = \"%s\", status = %s",
-                   chunk_element->session_id,
-                   chunk_id_str,
-                   chunk_element->chunk.name ?: "none",
-                   chunk_element->chunk.close_command.is_set ? "open" : "closed");
-               pthread_mutex_unlock(&chunk_element->chunk.lock);
-               lttng_trace_chunk_put(&chunk_element->chunk);
-               trace_chunks_left++;
-       }
-       rcu_read_unlock();
        DBG("Released reference to %u trace chunks in %s()", trace_chunks_left, __FUNCTION__);
 
        return trace_chunks_left;
This page took 0.031429 seconds and 4 git commands to generate.