X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Ftrace-chunk.c;h=dbab99d192876a73ce49be5975b674f55ec4e60e;hb=e10aec8f225c0822811c65401710a039d7e2d7d7;hp=172bd3df88e1d32247a93f06786f8c639de5225b;hpb=c35f9726a22f1d93e14589688d830efccda196f3;p=lttng-tools.git diff --git a/src/common/trace-chunk.c b/src/common/trace-chunk.c index 172bd3df8..dbab99d19 100644 --- a/src/common/trace-chunk.c +++ b/src/common/trace-chunk.c @@ -77,7 +77,7 @@ struct lttng_trace_chunk { struct lttng_dynamic_pointer_array top_level_directories; /* Is contained within an lttng_trace_chunk_registry_element? */ bool in_registry_element; - bool name_overriden; + bool name_overridden; char *name; /* An unset id means the chunk is anonymous. */ LTTNG_OPTIONAL(uint64_t) id; @@ -381,13 +381,13 @@ end: LTTNG_HIDDEN enum lttng_trace_chunk_status lttng_trace_chunk_get_name( struct lttng_trace_chunk *chunk, const char **name, - bool *name_overriden) + bool *name_overridden) { enum lttng_trace_chunk_status status = LTTNG_TRACE_CHUNK_STATUS_OK; pthread_mutex_lock(&chunk->lock); - if (name_overriden) { - *name_overriden = chunk->name_overriden; + if (name_overridden) { + *name_overridden = chunk->name_overridden; } if (!chunk->name) { status = LTTNG_TRACE_CHUNK_STATUS_NONE; @@ -450,7 +450,7 @@ enum lttng_trace_chunk_status lttng_trace_chunk_override_name( } free(chunk->name); chunk->name = new_name; - chunk->name_overriden = true; + chunk->name_overridden = true; end_unlock: pthread_mutex_unlock(&chunk->lock); end: @@ -840,7 +840,7 @@ void lttng_trace_chunk_move_to_completed(struct lttng_trace_chunk *trace_chunk) } assert(trace_chunk->mode.value == TRACE_CHUNK_MODE_OWNER); - assert(!trace_chunk->name_overriden); + assert(!trace_chunk->name_overridden); /* * The fist trace chunk of a session is directly output to the @@ -1293,3 +1293,49 @@ lttng_trace_chunk_registry_find_anonymous_chunk( return _lttng_trace_chunk_registry_find_chunk(registry, session_id, NULL); } + +unsigned int lttng_trace_chunk_registry_put_each_chunk( + struct lttng_trace_chunk_registry *registry) +{ + struct cds_lfht_iter iter; + struct lttng_trace_chunk_registry_element *chunk_element; + 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; + } + } + + 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; +}