Compile fix following moved headers
[lttng-ust.git] / liblttng-ust / ltt-probes.c
... / ...
CommitLineData
1/*
2 * ltt-probes.c
3 *
4 * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 *
6 * Holds LTTng probes registry.
7 *
8 * Dual LGPL v2.1/GPL v2 license.
9 */
10
11#include <string.h>
12#include <errno.h>
13#include <urcu/list.h>
14#include <lttng/core.h>
15#include <lttng/ust-events.h>
16#include <assert.h>
17
18#include "ltt-tracer-core.h"
19
20/*
21 * probe list is protected by ust_lock()/ust_unlock().
22 */
23static CDS_LIST_HEAD(probe_list);
24
25static
26const struct lttng_event_desc *find_event(const char *name)
27{
28 struct lttng_probe_desc *probe_desc;
29 int i;
30
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];
35 }
36 }
37 return NULL;
38}
39
40int ltt_probe_register(struct lttng_probe_desc *desc)
41{
42 int ret = 0;
43 int i;
44
45 ust_lock();
46 /*
47 * TODO: This is O(N^2). Turn into a hash table when probe registration
48 * overhead becomes an issue.
49 */
50 for (i = 0; i < desc->nr_events; i++) {
51 if (find_event(desc->event_desc[i].name)) {
52 ret = -EEXIST;
53 goto end;
54 }
55 }
56 cds_list_add(&desc->head, &probe_list);
57
58 /*
59 * fix the events awaiting probe load.
60 */
61 for (i = 0; i < desc->nr_events; i++) {
62 ret = pending_probe_fix_events(&desc->event_desc[i]);
63 assert(!ret);
64 }
65end:
66 ust_unlock();
67 return ret;
68}
69
70void ltt_probe_unregister(struct lttng_probe_desc *desc)
71{
72 ust_lock();
73 cds_list_del(&desc->head);
74 ust_unlock();
75}
76
77/*
78 * called with UST lock held.
79 */
80const struct lttng_event_desc *ltt_event_get(const char *name)
81{
82 const struct lttng_event_desc *event;
83
84 event = find_event(name);
85 if (!event)
86 return NULL;
87 return event;
88}
89
90void ltt_event_put(const struct lttng_event_desc *event)
91{
92}
93
94#if 0
95static
96void *tp_list_start(struct seq_file *m, loff_t *pos)
97{
98 struct lttng_probe_desc *probe_desc;
99 int iter = 0, i;
100
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++) {
104 if (iter++ >= *pos)
105 return (void *) &probe_desc->event_desc[i];
106 }
107 }
108 /* End of list */
109 return NULL;
110}
111
112static
113void *tp_list_next(struct seq_file *m, void *p, loff_t *ppos)
114{
115 struct lttng_probe_desc *probe_desc;
116 int iter = 0, i;
117
118 (*ppos)++;
119 cds_list_for_each_entry(probe_desc, &probe_list, head) {
120 for (i = 0; i < probe_desc->nr_events; i++) {
121 if (iter++ >= *ppos)
122 return (void *) &probe_desc->event_desc[i];
123 }
124 }
125 /* End of list */
126 return NULL;
127}
128
129static
130void tp_list_stop(struct seq_file *m, void *p)
131{
132 pthread_mutex_unlock(&probe_mutex);
133}
134
135static
136int tp_list_show(struct seq_file *m, void *p)
137{
138 const struct lttng_event_desc *probe_desc = p;
139
140 /*
141 * Don't export lttng internal events (metadata).
142 */
143 if (!strncmp(probe_desc->name, "lttng_", sizeof("lttng_") - 1))
144 return 0;
145 seq_printf(m, "event { name = %s; };\n",
146 probe_desc->name);
147 return 0;
148}
149
150static
151const 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,
156};
157
158static
159int lttng_tracepoint_list_open(struct inode *inode, struct file *file)
160{
161 return seq_open(file, &lttng_tracepoint_list_seq_ops);
162}
163
164const struct file_operations lttng_tracepoint_list_fops = {
165 .open = lttng_tracepoint_list_open,
166 .read = seq_read,
167 .llseek = seq_lseek,
168 .release = seq_release,
169};
170#endif //0
This page took 0.023367 seconds and 4 git commands to generate.