X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-probes.c;h=6b671da06c673ad0f6c59622062038439b46f138;hb=refs%2Fheads%2Fstable-2.1;hp=9d7d83ceab716c62687bef3801ab0b59c6a56a0d;hpb=e58095efc3a51a505fc533e3e56b9b5ed8743a8b;p=lttng-ust.git diff --git a/liblttng-ust/lttng-probes.c b/liblttng-ust/lttng-probes.c index 9d7d83ce..6b671da0 100644 --- a/liblttng-ust/lttng-probes.c +++ b/liblttng-ust/lttng-probes.c @@ -58,19 +58,20 @@ const struct lttng_probe_desc *find_provider(const char *provider) } static -const struct lttng_event_desc *find_event(const char *name) +int check_event_provider(struct lttng_probe_desc *desc) { - struct lttng_probe_desc *probe_desc; int i; + size_t provider_name_len; - cds_list_for_each_entry(probe_desc, &probe_list, head) { - for (i = 0; i < probe_desc->nr_events; i++) { - if (!strncmp(probe_desc->event_desc[i]->name, name, - LTTNG_UST_SYM_NAME_LEN - 1)) - return probe_desc->event_desc[i]; - } + provider_name_len = strnlen(desc->provider, + LTTNG_UST_SYM_NAME_LEN - 1); + for (i = 0; i < desc->nr_events; i++) { + if (strncmp(desc->event_desc[i]->name, + desc->provider, + provider_name_len)) + return 0; /* provider mismatch */ } - return NULL; + return 1; } int lttng_probe_register(struct lttng_probe_desc *desc) @@ -80,20 +81,28 @@ int lttng_probe_register(struct lttng_probe_desc *desc) int i; ust_lock(); + + /* + * Check if the provider has already been registered. + */ if (find_provider(desc->provider)) { ret = -EEXIST; goto end; } + /* - * TODO: This is O(N^2). Turn into a hash table when probe registration - * overhead becomes an issue. + * Each provider enforce that every event name begins with the + * provider name. Check this in an assertion for extra + * carefulness. This ensures we cannot have duplicate event + * names across providers. + */ + assert(check_event_provider(desc)); + + /* + * The provider ensures there are no duplicate event names. + * Duplicated TRACEPOINT_EVENT event names would generate a + * compile-time error due to duplicated symbol names. */ - for (i = 0; i < desc->nr_events; i++) { - if (find_event(desc->event_desc[i]->name)) { - ret = -EEXIST; - goto end; - } - } /* * We sort the providers by struct lttng_probe_desc pointer @@ -149,23 +158,6 @@ void ltt_probe_unregister(struct lttng_probe_desc *desc) lttng_probe_unregister(desc); } -/* - * called with UST lock held. - */ -const struct lttng_event_desc *lttng_event_get(const char *name) -{ - const struct lttng_event_desc *event; - - event = find_event(name); - if (!event) - return NULL; - return event; -} - -void lttng_event_put(const struct lttng_event_desc *event) -{ -} - void lttng_probes_prune_event_list(struct lttng_ust_tracepoint_list *list) { struct tp_list_entry *list_entry, *tmp;