X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-registry.c;h=e22fc6fcfbfc93246172db98e398be6783b99285;hb=1950109e7a08d8064ef5b1f446524274b4fa72d5;hp=7250dd12d751b0edcce93ffd4b886f8bdd7c7395;hpb=36b588eddce05ef840bd247f6a58316925b9a0a2;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-registry.c b/src/bin/lttng-sessiond/ust-registry.c index 7250dd12d..e22fc6fcf 100644 --- a/src/bin/lttng-sessiond/ust-registry.c +++ b/src/bin/lttng-sessiond/ust-registry.c @@ -23,6 +23,7 @@ #include #include "ust-registry.h" +#include "utils.h" /* * Hash table match function for event in the registry. @@ -197,34 +198,34 @@ int ust_registry_create_event(struct ust_registry_session *session, assert(sig); assert(event_id_p); + rcu_read_lock(); + /* * This should not happen but since it comes from the UST tracer, an * external party, don't assert and simply validate values. */ if (session_objd < 0 || channel_objd < 0) { ret = -EINVAL; - goto error; + goto error_free; } - rcu_read_lock(); - chan = ust_registry_channel_find(session, chan_key); if (!chan) { ret = -EINVAL; - goto error_unlock; + goto error_free; } /* Check if we've reached the maximum possible id. */ if (ust_registry_is_max_id(chan->used_event_id)) { ret = -ENOENT; - goto error_unlock; + goto error_free; } event = alloc_event(session_objd, channel_objd, name, sig, nr_fields, fields, loglevel, model_emf_uri); if (!event) { ret = -ENOMEM; - goto error_unlock; + goto error_free; } DBG3("UST registry creating event with event: %s, sig: %s, id: %u, " @@ -278,9 +279,12 @@ int ust_registry_create_event(struct ust_registry_session *session, rcu_read_unlock(); return 0; +error_free: + free(sig); + free(fields); + free(model_emf_uri); error_unlock: rcu_read_unlock(); -error: destroy_event(event); return ret; } @@ -310,9 +314,9 @@ void ust_registry_destroy_event(struct ust_registry_channel *chan, /* * We need to execute ht_destroy outside of RCU read-side critical - * section, so we postpone its execution using call_rcu. It is simpler - * than to change the semantic of the many callers of - * destroy_channel(). + * section and outside of call_rcu thread, so we postpone its execution + * using ht_cleanup_push. It is simpler than to change the semantic of + * the many callers of delete_ust_app_session(). */ static void destroy_channel_rcu(struct rcu_head *head) @@ -320,7 +324,10 @@ void destroy_channel_rcu(struct rcu_head *head) struct ust_registry_channel *chan = caa_container_of(head, struct ust_registry_channel, rcu_head); - lttng_ht_destroy(chan->ht); + if (chan->ht) { + ht_cleanup_push(chan->ht); + } + free(chan->ctx_fields); free(chan); } @@ -361,7 +368,7 @@ int ust_registry_channel_add(struct ust_registry_session *session, if (!chan) { PERROR("zmalloc ust registry channel"); ret = -ENOMEM; - goto error; + goto error_alloc; } chan->ht = lttng_ht_new(0, LTTNG_HT_TYPE_STRING); @@ -390,7 +397,11 @@ int ust_registry_channel_add(struct ust_registry_session *session, lttng_ht_add_unique_u64(session->channels, &chan->node); rcu_read_unlock(); + return 0; + error: + destroy_channel(chan); +error_alloc: return ret; } @@ -480,7 +491,7 @@ int ust_registry_session_init(struct ust_registry_session **sessionp, session = zmalloc(sizeof(*session)); if (!session) { PERROR("zmalloc ust registry session"); - goto error; + goto error_alloc; } pthread_mutex_init(&session->lock, NULL); @@ -516,6 +527,8 @@ int ust_registry_session_init(struct ust_registry_session **sessionp, return 0; error: + ust_registry_session_destroy(session); +error_alloc: return -1; } @@ -543,6 +556,6 @@ void ust_registry_session_destroy(struct ust_registry_session *reg) } rcu_read_unlock(); - lttng_ht_destroy(reg->channels); + ht_cleanup_push(reg->channels); free(reg->metadata); }