X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-registry.c;h=ed830b60821cc67154879c629655f48e7b62bf10;hp=dea443d94fbb1e74fc9ecffd105cb3bf1fe7b42d;hb=dd73d57bb95fae31161ca0781108d166082a06f5;hpb=7062f070b01e86c2e29490ea41e25f1f519ceadb diff --git a/src/bin/lttng-sessiond/ust-registry.c b/src/bin/lttng-sessiond/ust-registry.c index dea443d94..ed830b608 100644 --- a/src/bin/lttng-sessiond/ust-registry.c +++ b/src/bin/lttng-sessiond/ust-registry.c @@ -26,6 +26,8 @@ #include "ust-registry.h" #include "ust-app.h" #include "utils.h" +#include "lttng-sessiond.h" +#include "notification-thread-commands.h" /* * Hash table match function for event in the registry. @@ -60,10 +62,10 @@ no_match: return 0; } -static unsigned long ht_hash_event(void *_key, unsigned long seed) +static unsigned long ht_hash_event(const void *_key, unsigned long seed) { uint64_t xored_key; - struct ust_registry_event *key = _key; + const struct ust_registry_event *key = _key; assert(key); @@ -89,14 +91,23 @@ static int compare_enums(const struct ust_registry_enum *reg_enum_a, entries_a = ®_enum_a->entries[i]; entries_b = ®_enum_b->entries[i]; - if (entries_a->start != entries_b->start) { + if (entries_a->start.value != entries_b->start.value) { ret = -1; goto end; } - if (entries_a->end != entries_b->end) { + if (entries_a->end.value != entries_b->end.value) { ret = -1; goto end; } + if (entries_a->start.signedness != entries_b->start.signedness) { + ret = -1; + goto end; + } + if (entries_a->end.signedness != entries_b->end.signedness) { + ret = -1; + goto end; + } + if (strcmp(entries_a->string, entries_b->string)) { ret = -1; goto end; @@ -686,13 +697,23 @@ void destroy_channel_rcu(struct rcu_head *head) * free the registry pointer since it might not have been allocated before so * it's the caller responsability. */ -static void destroy_channel(struct ust_registry_channel *chan) +static void destroy_channel(struct ust_registry_channel *chan, bool notif) { struct lttng_ht_iter iter; struct ust_registry_event *event; + enum lttng_error_code cmd_ret; assert(chan); + if (notif) { + cmd_ret = notification_thread_command_remove_channel( + notification_thread_handle, chan->consumer_key, + LTTNG_DOMAIN_UST); + if (cmd_ret != LTTNG_OK) { + ERR("Failed to remove channel from notification thread"); + } + } + rcu_read_lock(); /* Destroy all event associated with this registry. */ cds_lfht_for_each_entry(chan->ht->ht, &iter.iter, event, node.node) { @@ -750,7 +771,7 @@ int ust_registry_channel_add(struct ust_registry_session *session, return 0; error: - destroy_channel(chan); + destroy_channel(chan, false); error_alloc: return ret; } @@ -789,7 +810,7 @@ end: * Remove channel using key from registry and free memory. */ void ust_registry_channel_del_free(struct ust_registry_session *session, - uint64_t key) + uint64_t key, bool notif) { struct lttng_ht_iter iter; struct ust_registry_channel *chan; @@ -808,7 +829,7 @@ void ust_registry_channel_del_free(struct ust_registry_session *session, ret = lttng_ht_del(session->channels, &iter); assert(!ret); rcu_read_unlock(); - destroy_channel(chan); + destroy_channel(chan, notif); end: return; @@ -899,7 +920,7 @@ int ust_registry_session_init(struct ust_registry_session **sessionp, session->enums = lttng_ht_new(0, LTTNG_HT_TYPE_STRING); if (!session->enums) { - ret = -ENOMEM; + ERR("Failed to create enums hash table"); goto error; } /* hash/match functions are specified at call site. */ @@ -963,7 +984,7 @@ void ust_registry_session_destroy(struct ust_registry_session *reg) /* Delete the node from the ht and free it. */ ret = lttng_ht_del(reg->channels, &iter); assert(!ret); - destroy_channel(chan); + destroy_channel(chan, true); } rcu_read_unlock(); ht_cleanup_push(reg->channels); @@ -985,7 +1006,7 @@ void ust_registry_session_destroy(struct ust_registry_session *reg) /* * Try deleting the directory hierarchy. */ - (void) run_as_recursive_rmdir(reg->root_shm_path, + (void) run_as_rmdir_recursive(reg->root_shm_path, reg->uid, reg->gid); } /* Destroy the enum hash table */