X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=libust%2Fltt-probes.c;h=04392d8e6f479ddd452eb388933720a58f753d39;hb=44e073f54f10c398cbe10c702a36915d414e5e62;hp=45d2dabdef22e977fe8122deeb9a5417aa07fc21;hpb=ce5aef0bb1fdfec2688f57aa2356447577ca64db;p=lttng-ust.git diff --git a/libust/ltt-probes.c b/libust/ltt-probes.c index 45d2dabd..04392d8e 100644 --- a/libust/ltt-probes.c +++ b/libust/ltt-probes.c @@ -8,15 +8,18 @@ * Dual LGPL v2.1/GPL v2 license. */ -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include "ltt-events.h" +#include "ltt-tracer-core.h" -static LIST_HEAD(probe_list); -static DEFINE_MUTEX(probe_mutex); +/* + * probe list is protected by ust_lock()/ust_unlock(). + */ +static CDS_LIST_HEAD(probe_list); static const struct lttng_event_desc *find_event(const char *name) @@ -24,7 +27,7 @@ const struct lttng_event_desc *find_event(const char *name) struct lttng_probe_desc *probe_desc; int i; - list_for_each_entry(probe_desc, &probe_list, head) { + 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]; @@ -38,7 +41,7 @@ int ltt_probe_register(struct lttng_probe_desc *desc) int ret = 0; int i; - mutex_lock(&probe_mutex); + ust_lock(); /* * TODO: This is O(N^2). Turn into a hash table when probe registration * overhead becomes an issue. @@ -49,51 +52,53 @@ int ltt_probe_register(struct lttng_probe_desc *desc) goto end; } } - list_add(&desc->head, &probe_list); + cds_list_add(&desc->head, &probe_list); + + /* + * fix the events awaiting probe load. + */ + for (i = 0; i < desc->nr_events; i++) { + ret = pending_probe_fix_events(&desc->event_desc[i]); + assert(!ret); + } end: - mutex_unlock(&probe_mutex); + ust_unlock(); return ret; } -EXPORT_SYMBOL_GPL(ltt_probe_register); void ltt_probe_unregister(struct lttng_probe_desc *desc) { - mutex_lock(&probe_mutex); - list_del(&desc->head); - mutex_unlock(&probe_mutex); + ust_lock(); + cds_list_del(&desc->head); + ust_unlock(); } -EXPORT_SYMBOL_GPL(ltt_probe_unregister); +/* + * called with UST lock held. + */ const struct lttng_event_desc *ltt_event_get(const char *name) { const struct lttng_event_desc *event; - int ret; - mutex_lock(&probe_mutex); event = find_event(name); - mutex_unlock(&probe_mutex); if (!event) return NULL; - ret = try_module_get(event->owner); - WARN_ON_ONCE(!ret); return event; } -EXPORT_SYMBOL_GPL(ltt_event_get); void ltt_event_put(const struct lttng_event_desc *event) { - module_put(event->owner); } -EXPORT_SYMBOL_GPL(ltt_event_put); +#if 0 static void *tp_list_start(struct seq_file *m, loff_t *pos) { struct lttng_probe_desc *probe_desc; int iter = 0, i; - mutex_lock(&probe_mutex); - list_for_each_entry(probe_desc, &probe_list, head) { + 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]; @@ -110,7 +115,7 @@ void *tp_list_next(struct seq_file *m, void *p, loff_t *ppos) int iter = 0, i; (*ppos)++; - list_for_each_entry(probe_desc, &probe_list, head) { + 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]; @@ -123,7 +128,7 @@ void *tp_list_next(struct seq_file *m, void *p, loff_t *ppos) static void tp_list_stop(struct seq_file *m, void *p) { - mutex_unlock(&probe_mutex); + pthread_mutex_unlock(&probe_mutex); } static @@ -161,3 +166,4 @@ const struct file_operations lttng_tracepoint_list_fops = { .llseek = seq_lseek, .release = seq_release, }; +#endif //0