X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Ftrace-chunk.c;h=affe3ac2050186043d5abd0590173e2f3296bd11;hp=6770bd982db393a45bdfda698614a1af2b4a6b54;hb=6b584c2ece62c620a86cf438bb358a9da7962b7e;hpb=1a414e3a88844a96aa23842822150ac44c391ed2 diff --git a/src/common/trace-chunk.c b/src/common/trace-chunk.c index 6770bd982..affe3ac20 100644 --- a/src/common/trace-chunk.c +++ b/src/common/trace-chunk.c @@ -367,6 +367,7 @@ end: return new_chunk; error_unlock: pthread_mutex_unlock(&source_chunk->lock); + lttng_trace_chunk_put(new_chunk); return NULL; } @@ -1357,6 +1358,41 @@ lttng_trace_chunk_registry_find_chunk( session_id, &chunk_id); } +LTTNG_HIDDEN +int lttng_trace_chunk_registry_chunk_exists( + const struct lttng_trace_chunk_registry *registry, + uint64_t session_id, uint64_t chunk_id, bool *chunk_exists) +{ + int ret = 0; + const struct lttng_trace_chunk_registry_element target_element = { + .chunk.id.is_set = true, + .chunk.id.value = chunk_id, + .session_id = session_id, + }; + const unsigned long element_hash = + lttng_trace_chunk_registry_element_hash( + &target_element); + struct cds_lfht_node *published_node; + struct cds_lfht_iter iter; + + rcu_read_lock(); + cds_lfht_lookup(registry->ht, + element_hash, + lttng_trace_chunk_registry_element_match, + &target_element, + &iter); + published_node = cds_lfht_iter_get_node(&iter); + if (!published_node) { + *chunk_exists = false; + goto end; + } + + *chunk_exists = !cds_lfht_is_node_deleted(published_node); +end: + rcu_read_unlock(); + return ret; +} + LTTNG_HIDDEN struct lttng_trace_chunk * lttng_trace_chunk_registry_find_anonymous_chunk(