X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fctf-trace.c;h=7c39e85068733270ebd7599bfaa5b03e6ff60ca8;hp=d965cec8caa72aa9dcf771282f399a63868a27ab;hb=a1075e32c32bc39d2d8e3cb2458346c4afa6fc08;hpb=7591bab11eceedc6a0d1e02fd6f85592267a63b5 diff --git a/src/bin/lttng-relayd/ctf-trace.c b/src/bin/lttng-relayd/ctf-trace.c index d965cec8c..7c39e8506 100644 --- a/src/bin/lttng-relayd/ctf-trace.c +++ b/src/bin/lttng-relayd/ctf-trace.c @@ -17,7 +17,6 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE #include @@ -45,7 +44,7 @@ static void rcu_destroy_ctf_trace(struct rcu_head *rcu_head) * * MUST be called with the RCU read side lock. */ -void ctf_trace_destroy(struct ctf_trace *trace) +static void ctf_trace_destroy(struct ctf_trace *trace) { /* * Getting to this point, every stream referenced by that trace @@ -55,10 +54,12 @@ void ctf_trace_destroy(struct ctf_trace *trace) assert(cds_list_empty(&trace->stream_list)); session_put(trace->session); trace->session = NULL; + free(trace->path); + trace->path = NULL; call_rcu(&trace->rcu_node, rcu_destroy_ctf_trace); } -void ctf_trace_release(struct urcu_ref *ref) +static void ctf_trace_release(struct urcu_ref *ref) { struct ctf_trace *trace = caa_container_of(ref, struct ctf_trace, ref); @@ -76,17 +77,7 @@ void ctf_trace_release(struct urcu_ref *ref) */ bool ctf_trace_get(struct ctf_trace *trace) { - bool has_ref = false; - - /* Confirm that the trace refcount has not reached 0. */ - pthread_mutex_lock(&trace->reflock); - if (trace->ref.refcount != 0) { - has_ref = true; - urcu_ref_get(&trace->ref); - } - pthread_mutex_unlock(&trace->reflock); - - return has_ref; + return urcu_ref_get_unless_zero(&trace->ref); } /* @@ -96,23 +87,26 @@ bool ctf_trace_get(struct ctf_trace *trace) * put their reference, its refcount drops to 0. */ static struct ctf_trace *ctf_trace_create(struct relay_session *session, - char *path_name) + const char *subpath) { struct ctf_trace *trace; trace = zmalloc(sizeof(*trace)); if (!trace) { - PERROR("ctf_trace alloc"); - goto error; + PERROR("Failed to allocate ctf_trace"); + goto end; } + urcu_ref_init(&trace->ref); if (!session_get(session)) { - ERR("Cannot get session"); - free(trace); - trace = NULL; + ERR("Failed to acquire session reference"); goto error; } trace->session = session; + trace->path = strdup(subpath); + if (!trace->path) { + goto error; + } CDS_INIT_LIST_HEAD(&trace->stream_list); @@ -120,18 +114,21 @@ static struct ctf_trace *ctf_trace_create(struct relay_session *session, trace->id = ++last_relay_ctf_trace_id; pthread_mutex_unlock(&last_relay_ctf_trace_id_lock); - lttng_ht_node_init_str(&trace->node, path_name); + lttng_ht_node_init_str(&trace->node, trace->path); trace->session = session; - urcu_ref_init(&trace->ref); pthread_mutex_init(&trace->lock, NULL); - pthread_mutex_init(&trace->reflock, NULL); pthread_mutex_init(&trace->stream_list_lock, NULL); lttng_ht_add_str(session->ctf_traces_ht, &trace->node); - DBG("Created ctf_trace %" PRIu64 " with path: %s", trace->id, path_name); + DBG("Created ctf_trace %" PRIu64 "of session \"%s\" from host \"%s\" with path: %s", + trace->id, session->session_name, session->hostname, + subpath); -error: +end: return trace; +error: + ctf_trace_put(trace); + return NULL; } /* @@ -140,17 +137,17 @@ error: * ctf_trace_put(). */ struct ctf_trace *ctf_trace_get_by_path_or_create(struct relay_session *session, - char *path_name) + const char *subpath) { struct lttng_ht_node_str *node; struct lttng_ht_iter iter; struct ctf_trace *trace = NULL; rcu_read_lock(); - lttng_ht_lookup(session->ctf_traces_ht, (void *) path_name, &iter); + lttng_ht_lookup(session->ctf_traces_ht, subpath, &iter); node = lttng_ht_iter_get_node_str(&iter); if (!node) { - DBG("CTF Trace path %s not found", path_name); + DBG("CTF Trace path %s not found", subpath); goto end; } trace = caa_container_of(node, struct ctf_trace, node); @@ -161,7 +158,7 @@ end: rcu_read_unlock(); if (!trace) { /* Try to create */ - trace = ctf_trace_create(session, path_name); + trace = ctf_trace_create(session, subpath); } return trace; } @@ -169,9 +166,7 @@ end: void ctf_trace_put(struct ctf_trace *trace) { rcu_read_lock(); - pthread_mutex_lock(&trace->reflock); urcu_ref_put(&trace->ref, ctf_trace_release); - pthread_mutex_unlock(&trace->reflock); rcu_read_unlock(); } @@ -183,9 +178,10 @@ int ctf_trace_close(struct ctf_trace *trace) cds_list_for_each_entry_rcu(stream, &trace->stream_list, stream_node) { /* - * Close the stream. + * Close stream since the connection owning the trace is being + * torn down. */ - stream_close(stream); + try_stream_close(stream); } rcu_read_unlock(); /*