fix: redundant decl of channel_destroy (-Wredundant-decls)
[lttng-ust.git] / libringbuffer / frontend.h
1 /*
2 * SPDX-License-Identifier: LGPL-2.1-only
3 *
4 * Copyright (C) 2005-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 *
6 * Ring Buffer Library Synchronization Header (API).
7 *
8 * See ring_buffer_frontend.c for more information on wait-free algorithms.
9 */
10
11 #ifndef _LTTNG_RING_BUFFER_FRONTEND_H
12 #define _LTTNG_RING_BUFFER_FRONTEND_H
13
14 #include <stddef.h>
15 #include <stdint.h>
16
17 #include <urcu/compiler.h>
18 #include <urcu/uatomic.h>
19
20 #include "smp.h"
21
22 /* Internal helpers */
23 #include "frontend_internal.h"
24
25 /* Buffer creation/removal and setup operations */
26
27 /*
28 * switch_timer_interval is the time interval (in us) to fill sub-buffers with
29 * padding to let readers get those sub-buffers. Used for live streaming.
30 *
31 * read_timer_interval is the time interval (in us) to wake up pending readers.
32 *
33 * buf_addr is a pointer the the beginning of the preallocated buffer contiguous
34 * address mapping. It is used only by RING_BUFFER_STATIC configuration. It can
35 * be set to NULL for other backends.
36 *
37 * private data is a memory area for configuration data. This memory is
38 * managed by lib ring buffer. priv_data_align is the alignment required
39 * for the private data area.
40 */
41
42 __attribute__((visibility("hidden")))
43 extern
44 struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buffer_config *config,
45 const char *name,
46 size_t priv_data_align,
47 size_t priv_data_size,
48 void *priv_data_init,
49 void *priv,
50 void *buf_addr,
51 size_t subbuf_size, size_t num_subbuf,
52 unsigned int switch_timer_interval,
53 unsigned int read_timer_interval,
54 const int *stream_fds, int nr_stream_fds,
55 int64_t blocking_timeout);
56
57 /*
58 * channel_destroy finalizes all channel's buffers, waits for readers to
59 * release all references, and destroys the channel.
60 */
61 __attribute__((visibility("hidden")))
62 void channel_destroy(struct lttng_ust_lib_ring_buffer_channel *chan,
63 struct lttng_ust_shm_handle *handle,
64 int consumer);
65
66
67 /* Buffer read operations */
68
69 /*
70 * Iteration on channel cpumask needs to issue a read barrier to match the write
71 * barrier in cpu hotplug. It orders the cpumask read before read of per-cpu
72 * buffer data. The per-cpu buffer is never removed by cpu hotplug; teardown is
73 * only performed at channel destruction.
74 */
75 #define for_each_channel_cpu(cpu, chan) \
76 for_each_possible_cpu(cpu)
77
78 __attribute__((visibility("hidden")))
79 extern struct lttng_ust_lib_ring_buffer *channel_get_ring_buffer(
80 const struct lttng_ust_lib_ring_buffer_config *config,
81 struct lttng_ust_lib_ring_buffer_channel *chan, int cpu,
82 struct lttng_ust_shm_handle *handle,
83 int *shm_fd, int *wait_fd,
84 int *wakeup_fd,
85 uint64_t *memory_map_size);
86
87 __attribute__((visibility("hidden")))
88 extern
89 int ring_buffer_channel_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
90 struct lttng_ust_lib_ring_buffer_channel *chan,
91 struct lttng_ust_shm_handle *handle);
92
93 __attribute__((visibility("hidden")))
94 extern
95 int ring_buffer_channel_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
96 struct lttng_ust_lib_ring_buffer_channel *chan,
97 struct lttng_ust_shm_handle *handle);
98
99 __attribute__((visibility("hidden")))
100 extern
101 int ring_buffer_stream_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
102 struct lttng_ust_lib_ring_buffer_channel *chan,
103 struct lttng_ust_shm_handle *handle,
104 int cpu);
105
106 __attribute__((visibility("hidden")))
107 extern
108 int ring_buffer_stream_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
109 struct lttng_ust_lib_ring_buffer_channel *chan,
110 struct lttng_ust_shm_handle *handle,
111 int cpu);
112
113 __attribute__((visibility("hidden")))
114 extern int lib_ring_buffer_open_read(struct lttng_ust_lib_ring_buffer *buf,
115 struct lttng_ust_shm_handle *handle);
116
117 __attribute__((visibility("hidden")))
118 extern void lib_ring_buffer_release_read(struct lttng_ust_lib_ring_buffer *buf,
119 struct lttng_ust_shm_handle *handle);
120
121 /*
122 * Initialize signals for ring buffer. Should be called early e.g. by
123 * main() in the program to affect all threads.
124 */
125 __attribute__((visibility("hidden")))
126 void lib_ringbuffer_signal_init(void);
127
128 /*
129 * Read sequence: snapshot, many get_subbuf/put_subbuf, move_consumer.
130 */
131 __attribute__((visibility("hidden")))
132 extern int lib_ring_buffer_snapshot(struct lttng_ust_lib_ring_buffer *buf,
133 unsigned long *consumed,
134 unsigned long *produced,
135 struct lttng_ust_shm_handle *handle);
136
137 __attribute__((visibility("hidden")))
138 extern int lib_ring_buffer_snapshot_sample_positions(
139 struct lttng_ust_lib_ring_buffer *buf,
140 unsigned long *consumed,
141 unsigned long *produced,
142 struct lttng_ust_shm_handle *handle);
143
144 __attribute__((visibility("hidden")))
145 extern void lib_ring_buffer_move_consumer(struct lttng_ust_lib_ring_buffer *buf,
146 unsigned long consumed_new,
147 struct lttng_ust_shm_handle *handle);
148
149 __attribute__((visibility("hidden")))
150 extern int lib_ring_buffer_get_subbuf(struct lttng_ust_lib_ring_buffer *buf,
151 unsigned long consumed,
152 struct lttng_ust_shm_handle *handle);
153 __attribute__((visibility("hidden")))
154 extern void lib_ring_buffer_put_subbuf(struct lttng_ust_lib_ring_buffer *buf,
155 struct lttng_ust_shm_handle *handle);
156
157 /*
158 * lib_ring_buffer_get_next_subbuf/lib_ring_buffer_put_next_subbuf are helpers
159 * to read sub-buffers sequentially.
160 */
161 static inline int lib_ring_buffer_get_next_subbuf(struct lttng_ust_lib_ring_buffer *buf,
162 struct lttng_ust_shm_handle *handle)
163 {
164 int ret;
165
166 ret = lib_ring_buffer_snapshot(buf, &buf->cons_snapshot,
167 &buf->prod_snapshot, handle);
168 if (ret)
169 return ret;
170 ret = lib_ring_buffer_get_subbuf(buf, buf->cons_snapshot, handle);
171 return ret;
172 }
173
174 static inline
175 void lib_ring_buffer_put_next_subbuf(struct lttng_ust_lib_ring_buffer *buf,
176 struct lttng_ust_shm_handle *handle)
177 {
178 struct lttng_ust_lib_ring_buffer_channel *chan;
179
180 chan = shmp(handle, buf->backend.chan);
181 if (!chan)
182 return;
183 lib_ring_buffer_put_subbuf(buf, handle);
184 lib_ring_buffer_move_consumer(buf, subbuf_align(buf->cons_snapshot, chan),
185 handle);
186 }
187
188 __attribute__((visibility("hidden")))
189 extern void channel_reset(struct lttng_ust_lib_ring_buffer_channel *chan);
190
191 __attribute__((visibility("hidden")))
192 extern void lib_ring_buffer_reset(struct lttng_ust_lib_ring_buffer *buf,
193 struct lttng_ust_shm_handle *handle);
194
195 static inline
196 unsigned long lib_ring_buffer_get_offset(const struct lttng_ust_lib_ring_buffer_config *config,
197 struct lttng_ust_lib_ring_buffer *buf)
198 {
199 return v_read(config, &buf->offset);
200 }
201
202 static inline
203 unsigned long lib_ring_buffer_get_consumed(const struct lttng_ust_lib_ring_buffer_config *config,
204 struct lttng_ust_lib_ring_buffer *buf)
205 {
206 return uatomic_read(&buf->consumed);
207 }
208
209 /*
210 * Must call lib_ring_buffer_is_finalized before reading counters (memory
211 * ordering enforced with respect to trace teardown).
212 */
213 static inline
214 int lib_ring_buffer_is_finalized(const struct lttng_ust_lib_ring_buffer_config *config,
215 struct lttng_ust_lib_ring_buffer *buf)
216 {
217 int finalized = CMM_ACCESS_ONCE(buf->finalized);
218 /*
219 * Read finalized before counters.
220 */
221 cmm_smp_rmb();
222 return finalized;
223 }
224
225 static inline
226 int lib_ring_buffer_channel_is_finalized(const struct lttng_ust_lib_ring_buffer_channel *chan)
227 {
228 return chan->finalized;
229 }
230
231 static inline
232 int lib_ring_buffer_channel_is_disabled(const struct lttng_ust_lib_ring_buffer_channel *chan)
233 {
234 return uatomic_read(&chan->record_disabled);
235 }
236
237 static inline
238 unsigned long lib_ring_buffer_get_read_data_size(
239 const struct lttng_ust_lib_ring_buffer_config *config,
240 struct lttng_ust_lib_ring_buffer *buf,
241 struct lttng_ust_shm_handle *handle)
242 {
243 return subbuffer_get_read_data_size(config, &buf->backend, handle);
244 }
245
246 static inline
247 unsigned long lib_ring_buffer_get_records_count(
248 const struct lttng_ust_lib_ring_buffer_config *config,
249 struct lttng_ust_lib_ring_buffer *buf)
250 {
251 return v_read(config, &buf->records_count);
252 }
253
254 static inline
255 unsigned long lib_ring_buffer_get_records_overrun(
256 const struct lttng_ust_lib_ring_buffer_config *config,
257 struct lttng_ust_lib_ring_buffer *buf)
258 {
259 return v_read(config, &buf->records_overrun);
260 }
261
262 static inline
263 unsigned long lib_ring_buffer_get_records_lost_full(
264 const struct lttng_ust_lib_ring_buffer_config *config,
265 struct lttng_ust_lib_ring_buffer *buf)
266 {
267 return v_read(config, &buf->records_lost_full);
268 }
269
270 static inline
271 unsigned long lib_ring_buffer_get_records_lost_wrap(
272 const struct lttng_ust_lib_ring_buffer_config *config,
273 struct lttng_ust_lib_ring_buffer *buf)
274 {
275 return v_read(config, &buf->records_lost_wrap);
276 }
277
278 static inline
279 unsigned long lib_ring_buffer_get_records_lost_big(
280 const struct lttng_ust_lib_ring_buffer_config *config,
281 struct lttng_ust_lib_ring_buffer *buf)
282 {
283 return v_read(config, &buf->records_lost_big);
284 }
285
286 static inline
287 unsigned long lib_ring_buffer_get_records_read(
288 const struct lttng_ust_lib_ring_buffer_config *config,
289 struct lttng_ust_lib_ring_buffer *buf)
290 {
291 return v_read(config, &buf->backend.records_read);
292 }
293
294 #endif /* _LTTNG_RING_BUFFER_FRONTEND_H */
This page took 0.036641 seconds and 5 git commands to generate.