4 * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * Holds LTTng probes registry.
8 * Dual LGPL v2.1/GPL v2 license.
13 #include <urcu/list.h>
14 #include <lttng/core.h>
15 #include <lttng/ust-events.h>
18 #include "ltt-tracer-core.h"
21 * probe list is protected by ust_lock()/ust_unlock().
23 static CDS_LIST_HEAD(probe_list
);
26 const struct lttng_event_desc
*find_event(const char *name
)
28 struct lttng_probe_desc
*probe_desc
;
31 cds_list_for_each_entry(probe_desc
, &probe_list
, head
) {
32 for (i
= 0; i
< probe_desc
->nr_events
; i
++) {
33 if (!strcmp(probe_desc
->event_desc
[i
].name
, name
))
34 return &probe_desc
->event_desc
[i
];
40 int ltt_probe_register(struct lttng_probe_desc
*desc
)
47 * TODO: This is O(N^2). Turn into a hash table when probe registration
48 * overhead becomes an issue.
50 for (i
= 0; i
< desc
->nr_events
; i
++) {
51 if (find_event(desc
->event_desc
[i
].name
)) {
56 cds_list_add(&desc
->head
, &probe_list
);
59 * fix the events awaiting probe load.
61 for (i
= 0; i
< desc
->nr_events
; i
++) {
62 ret
= pending_probe_fix_events(&desc
->event_desc
[i
]);
70 void ltt_probe_unregister(struct lttng_probe_desc
*desc
)
73 cds_list_del(&desc
->head
);
78 * called with UST lock held.
80 const struct lttng_event_desc
*ltt_event_get(const char *name
)
82 const struct lttng_event_desc
*event
;
84 event
= find_event(name
);
90 void ltt_event_put(const struct lttng_event_desc
*event
)
96 void *tp_list_start(struct seq_file
*m
, loff_t
*pos
)
98 struct lttng_probe_desc
*probe_desc
;
101 pthread_mutex_lock(&probe_mutex
);
102 cds_list_for_each_entry(probe_desc
, &probe_list
, head
) {
103 for (i
= 0; i
< probe_desc
->nr_events
; i
++) {
105 return (void *) &probe_desc
->event_desc
[i
];
113 void *tp_list_next(struct seq_file
*m
, void *p
, loff_t
*ppos
)
115 struct lttng_probe_desc
*probe_desc
;
119 cds_list_for_each_entry(probe_desc
, &probe_list
, head
) {
120 for (i
= 0; i
< probe_desc
->nr_events
; i
++) {
122 return (void *) &probe_desc
->event_desc
[i
];
130 void tp_list_stop(struct seq_file
*m
, void *p
)
132 pthread_mutex_unlock(&probe_mutex
);
136 int tp_list_show(struct seq_file
*m
, void *p
)
138 const struct lttng_event_desc
*probe_desc
= p
;
141 * Don't export lttng internal events (metadata).
143 if (!strncmp(probe_desc
->name
, "lttng_", sizeof("lttng_") - 1))
145 seq_printf(m
, "event { name = %s; };\n",
151 const struct seq_operations lttng_tracepoint_list_seq_ops
= {
152 .start
= tp_list_start
,
153 .next
= tp_list_next
,
154 .stop
= tp_list_stop
,
155 .show
= tp_list_show
,
159 int lttng_tracepoint_list_open(struct inode
*inode
, struct file
*file
)
161 return seq_open(file
, <tng_tracepoint_list_seq_ops
);
164 const struct file_operations lttng_tracepoint_list_fops
= {
165 .open
= lttng_tracepoint_list_open
,
168 .release
= seq_release
,