X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-registry.c;h=37049b525559585ce7e2aed4a8f13f8b6fddb036;hb=4d3350dd504d64cb10770c683848afd04a5817ea;hp=1990655ef638368955a52b1f705422cc606db20b;hpb=da860cab17385f982e501d8a9f8295fe4a24f43d;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-registry.c b/src/bin/lttng-sessiond/ust-registry.c index 1990655ef..37049b525 100644 --- a/src/bin/lttng-sessiond/ust-registry.c +++ b/src/bin/lttng-sessiond/ust-registry.c @@ -25,15 +25,18 @@ #include "ust-registry.h" #include "ust-app.h" +#include "ust-field-utils.h" #include "utils.h" + /* * Hash table match function for event in the registry. */ static int ht_match_event(struct cds_lfht_node *node, const void *_key) { - struct ust_registry_event *event; const struct ust_registry_event *key; + struct ust_registry_event *event; + int i; assert(node); assert(_key); @@ -42,15 +45,37 @@ static int ht_match_event(struct cds_lfht_node *node, const void *_key) assert(event); key = _key; - /* It has to be a perfect match. */ + /* It has to be a perfect match. First, compare the event names. */ if (strncmp(event->name, key->name, sizeof(event->name))) { goto no_match; } - /* It has to be a perfect match. */ - if (strncmp(event->signature, key->signature, - strlen(event->signature))) { + /* Compare log levels. */ + if (event->loglevel_value != key->loglevel_value) { + goto no_match; + } + + /* Compare the number of fields. */ + if (event->nr_fields != key->nr_fields) { + goto no_match; + } + + /* Compare each field individually. */ + for (i = 0; i < event->nr_fields; i++) { + if (!match_ustctl_field(&event->fields[i], &key->fields[i])) { + goto no_match; + } + } + + /* Compare model URI. */ + if (event->model_emf_uri != NULL && key->model_emf_uri == NULL) { + goto no_match; + } else if(event->model_emf_uri == NULL && key->model_emf_uri != NULL) { goto no_match; + } else if (event->model_emf_uri != NULL && key->model_emf_uri != NULL) { + if (strcmp(event->model_emf_uri, key->model_emf_uri)) { + goto no_match; + } } /* Match */ @@ -62,15 +87,14 @@ no_match: static unsigned long ht_hash_event(void *_key, unsigned long seed) { - uint64_t xored_key; + uint64_t hashed_key; struct ust_registry_event *key = _key; assert(key); - xored_key = (uint64_t) (hash_key_str(key->name, seed) ^ - hash_key_str(key->signature, seed)); + hashed_key = (uint64_t) hash_key_str(key->name, seed); - return hash_key_u64(&xored_key, seed); + return hash_key_u64(&hashed_key, seed); } static int compare_enums(const struct ust_registry_enum *reg_enum_a, @@ -89,14 +113,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.value != entries_b->end.value) { ret = -1; goto end; } - if (entries_a->end != entries_b->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; @@ -523,8 +556,8 @@ struct ust_registry_enum * struct lttng_ht_iter iter; cds_lfht_lookup(session->enums->ht, - ht_hash_enum((void *) ®_enum_lookup, lttng_ht_seed), - ht_match_enum, ®_enum_lookup, &iter.iter); + ht_hash_enum((void *) reg_enum_lookup, lttng_ht_seed), + ht_match_enum, reg_enum_lookup, &iter.iter); node = lttng_ht_iter_get_node_str(&iter); if (!node) { goto end; @@ -860,6 +893,8 @@ int ust_registry_session_init(struct ust_registry_session **sessionp, session->uid = euid; session->gid = egid; session->next_enum_id = 0; + session->major = major; + session->minor = minor; strncpy(session->root_shm_path, root_shm_path, sizeof(session->root_shm_path)); session->root_shm_path[sizeof(session->root_shm_path) - 1] = '\0';