X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Fltt-probes.c;h=5f55bfa898a62e1c2c4a795d30e7499944621890;hb=f03d1c0acff59c8d66c6259234f31a8c542f8fd2;hp=fda35bf994104f9dc2d6b27b24d4a86f15375ce4;hpb=a3bb4b278286aaa20867ba68bd5b5a5853974126;p=lttng-ust.git diff --git a/liblttng-ust/ltt-probes.c b/liblttng-ust/ltt-probes.c index fda35bf9..5f55bfa8 100644 --- a/liblttng-ust/ltt-probes.c +++ b/liblttng-ust/ltt-probes.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -22,6 +21,18 @@ */ static CDS_LIST_HEAD(probe_list); +static +const struct lttng_probe_desc *find_provider(const char *provider) +{ + struct lttng_probe_desc *iter; + + cds_list_for_each_entry(iter, &probe_list, head) { + if (!strcmp(iter->provider, provider)) + return iter; + } + return NULL; +} + static const struct lttng_event_desc *find_event(const char *name) { @@ -30,8 +41,8 @@ const struct lttng_event_desc *find_event(const char *name) cds_list_for_each_entry(probe_desc, &probe_list, head) { for (i = 0; i < probe_desc->nr_events; i++) { - if (!strcmp(probe_desc->event_desc[i].name, name)) - return &probe_desc->event_desc[i]; + if (!strcmp(probe_desc->event_desc[i]->name, name)) + return probe_desc->event_desc[i]; } } return NULL; @@ -39,27 +50,47 @@ const struct lttng_event_desc *find_event(const char *name) int ltt_probe_register(struct lttng_probe_desc *desc) { + struct lttng_probe_desc *iter; int ret = 0; int i; ust_lock(); + 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. */ for (i = 0; i < desc->nr_events; i++) { - if (find_event(desc->event_desc[i].name)) { + if (find_event(desc->event_desc[i]->name)) { ret = -EEXIST; goto end; } } + + /* + * We sort the providers by struct lttng_probe_desc pointer + * address. + */ + cds_list_for_each_entry_reverse(iter, &probe_list, head) { + BUG_ON(iter == desc); /* Should never be in the list twice */ + if (iter < desc) { + /* We belong to the location right after iter. */ + cds_list_add(&desc->head, &iter->head); + goto desc_added; + } + } + /* We should be added at the head of the list */ cds_list_add(&desc->head, &probe_list); +desc_added: /* * fix the events awaiting probe load. */ for (i = 0; i < desc->nr_events; i++) { - ret = pending_probe_fix_events(&desc->event_desc[i]); + ret = pending_probe_fix_events(desc->event_desc[i]); assert(!ret); } end: @@ -90,81 +121,3 @@ const struct lttng_event_desc *ltt_event_get(const char *name) void ltt_event_put(const struct lttng_event_desc *event) { } - -#if 0 -static -void *tp_list_start(struct seq_file *m, loff_t *pos) -{ - struct lttng_probe_desc *probe_desc; - int iter = 0, i; - - pthread_mutex_lock(&probe_mutex); - cds_list_for_each_entry(probe_desc, &probe_list, head) { - for (i = 0; i < probe_desc->nr_events; i++) { - if (iter++ >= *pos) - return (void *) &probe_desc->event_desc[i]; - } - } - /* End of list */ - return NULL; -} - -static -void *tp_list_next(struct seq_file *m, void *p, loff_t *ppos) -{ - struct lttng_probe_desc *probe_desc; - int iter = 0, i; - - (*ppos)++; - cds_list_for_each_entry(probe_desc, &probe_list, head) { - for (i = 0; i < probe_desc->nr_events; i++) { - if (iter++ >= *ppos) - return (void *) &probe_desc->event_desc[i]; - } - } - /* End of list */ - return NULL; -} - -static -void tp_list_stop(struct seq_file *m, void *p) -{ - pthread_mutex_unlock(&probe_mutex); -} - -static -int tp_list_show(struct seq_file *m, void *p) -{ - const struct lttng_event_desc *probe_desc = p; - - /* - * Don't export lttng internal events (metadata). - */ - if (!strncmp(probe_desc->name, "lttng_", sizeof("lttng_") - 1)) - return 0; - seq_printf(m, "event { name = %s; };\n", - probe_desc->name); - return 0; -} - -static -const struct seq_operations lttng_tracepoint_list_seq_ops = { - .start = tp_list_start, - .next = tp_list_next, - .stop = tp_list_stop, - .show = tp_list_show, -}; - -static -int lttng_tracepoint_list_open(struct inode *inode, struct file *file) -{ - return seq_open(file, <tng_tracepoint_list_seq_ops); -} - -const struct file_operations lttng_tracepoint_list_fops = { - .open = lttng_tracepoint_list_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; -#endif //0