void *buf_addr,
size_t subbuf_size, size_t num_subbuf,
unsigned int switch_timer_interval,
- unsigned int read_timer_interval);
+ unsigned int read_timer_interval,
+ const int *stream_fds, int nr_stream_fds);
/*
* channel_destroy finalizes all channel's buffers, waits for readers to
int *wakeup_fd,
uint64_t *memory_map_size);
extern
-int ring_buffer_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
+int ring_buffer_channel_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
+ struct channel *chan,
+ struct lttng_ust_shm_handle *handle);
+extern
+int ring_buffer_channel_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
+ struct channel *chan,
+ struct lttng_ust_shm_handle *handle);
+extern
+int ring_buffer_stream_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
struct channel *chan,
struct lttng_ust_shm_handle *handle,
int cpu);
extern
-int ring_buffer_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
+int ring_buffer_stream_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
struct channel *chan,
struct lttng_ust_shm_handle *handle,
int cpu);
extern void lib_ring_buffer_release_read(struct lttng_ust_lib_ring_buffer *buf,
struct lttng_ust_shm_handle *handle);
+/*
+ * Initialize signals for ring buffer. Should be called early e.g. by
+ * main() in the program to affect all threads.
+ */
+void lib_ringbuffer_signal_init(void);
+
/*
* Read sequence: snapshot, many get_subbuf/put_subbuf, move_consumer.
*/
void lib_ring_buffer_put_next_subbuf(struct lttng_ust_lib_ring_buffer *buf,
struct lttng_ust_shm_handle *handle)
{
+ struct channel *chan;
+
+ chan = shmp(handle, buf->backend.chan);
+ if (!chan)
+ return;
lib_ring_buffer_put_subbuf(buf, handle);
- lib_ring_buffer_move_consumer(buf, subbuf_align(buf->cons_snapshot,
- shmp(handle, buf->backend.chan)), handle);
+ lib_ring_buffer_move_consumer(buf, subbuf_align(buf->cons_snapshot, chan),
+ handle);
}
extern void channel_reset(struct channel *chan);