/*
- * ring_buffer_frontend.c
+ * SPDX-License-Identifier: LGPL-2.1-only
*
* Copyright (C) 2005-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; only
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *
* Ring buffer wait-free buffer synchronization. Producer-consumer and flight
* recorder (overwrite) modes. See thesis:
*
#include <urcu/ref.h>
#include <urcu/tls-compat.h>
#include <poll.h>
-#include <helper.h>
+#include <ust-helper.h>
+
+#include <lttng/ust-align.h>
+#include <lttng/ringbuffer-context.h>
#include "smp.h"
-#include <lttng/ringbuffer-config.h>
+#include "ringbuffer-config.h"
#include "vatomic.h"
#include "backend.h"
#include "frontend.h"
static pthread_mutex_t wakeup_fd_mutex = PTHREAD_MUTEX_INITIALIZER;
static
-void lib_ring_buffer_print_errors(struct channel *chan,
+void lib_ring_buffer_print_errors(struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_lib_ring_buffer *buf, int cpu,
struct lttng_ust_shm_handle *handle);
}
/* Get blocking timeout, in ms */
-static int lttng_ust_ringbuffer_get_timeout(struct channel *chan)
+static int lttng_ust_ringbuffer_get_timeout(struct lttng_ust_lib_ring_buffer_channel *chan)
{
if (!lttng_ust_allow_blocking)
return 0;
void lib_ring_buffer_reset(struct lttng_ust_lib_ring_buffer *buf,
struct lttng_ust_shm_handle *handle)
{
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned int i;
* be using the iterator concurrently with reset. The previous current iterator
* record is reset.
*/
-void channel_reset(struct channel *chan)
+void channel_reset(struct lttng_ust_lib_ring_buffer_channel *chan)
{
/*
* Reset iterators first. Will put the subbuffer if held for reading.
struct shm_object *shmobj)
{
const struct lttng_ust_lib_ring_buffer_config *config = &chanb->config;
- struct channel *chan = caa_container_of(chanb, struct channel, backend);
+ struct lttng_ust_lib_ring_buffer_channel *chan = caa_container_of(chanb,
+ struct lttng_ust_lib_ring_buffer_channel, backend);
struct lttng_ust_lib_ring_buffer_backend_subbuffer *wsb;
- struct channel *shmp_chan;
+ struct lttng_ust_lib_ring_buffer_channel *shmp_chan;
struct commit_counters_hot *cc_hot;
void *priv = channel_get_private(chan);
size_t subbuf_header_size;
{
const struct lttng_ust_lib_ring_buffer_config *config;
struct lttng_ust_shm_handle *handle;
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
int cpu;
assert(CMM_LOAD_SHARED(timer_signal.tid) == pthread_self());
static
int lib_ring_buffer_poll_deliver(const struct lttng_ust_lib_ring_buffer_config *config,
struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle)
{
unsigned long consumed_old, consumed_idx, commit_count, write_offset;
}
static
-void lib_ring_buffer_channel_do_read(struct channel *chan)
+void lib_ring_buffer_channel_do_read(struct lttng_ust_lib_ring_buffer_channel *chan)
{
const struct lttng_ust_lib_ring_buffer_config *config;
struct lttng_ust_shm_handle *handle;
static
void lib_ring_buffer_channel_read_timer(int sig, siginfo_t *si, void *uc)
{
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
assert(CMM_LOAD_SHARED(timer_signal.tid) == pthread_self());
chan = si->si_value.sival_ptr;
}
static
-void lib_ring_buffer_channel_switch_timer_start(struct channel *chan)
+void lib_ring_buffer_channel_switch_timer_start(struct lttng_ust_lib_ring_buffer_channel *chan)
{
struct sigevent sev;
struct itimerspec its;
}
static
-void lib_ring_buffer_channel_switch_timer_stop(struct channel *chan)
+void lib_ring_buffer_channel_switch_timer_stop(struct lttng_ust_lib_ring_buffer_channel *chan)
{
int ret;
}
static
-void lib_ring_buffer_channel_read_timer_start(struct channel *chan)
+void lib_ring_buffer_channel_read_timer_start(struct lttng_ust_lib_ring_buffer_channel *chan)
{
const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config;
struct sigevent sev;
}
static
-void lib_ring_buffer_channel_read_timer_stop(struct channel *chan)
+void lib_ring_buffer_channel_read_timer_stop(struct lttng_ust_lib_ring_buffer_channel *chan)
{
const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config;
int ret;
chan->read_timer_enabled = 0;
}
-static void channel_unregister_notifiers(struct channel *chan,
+static void channel_unregister_notifiers(struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle)
{
lib_ring_buffer_channel_switch_timer_stop(chan);
lib_ring_buffer_channel_read_timer_stop(chan);
}
-static void channel_print_errors(struct channel *chan,
+static void channel_print_errors(struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle)
{
const struct lttng_ust_lib_ring_buffer_config *config =
}
}
-static void channel_free(struct channel *chan,
+static void channel_free(struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle,
int consumer)
{
{
int ret;
size_t shmsize, chansize;
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
struct lttng_ust_shm_handle *handle;
struct shm_object *shmobj;
unsigned int nr_streams;
goto error_table_alloc;
/* Calculate the shm allocation layout */
- shmsize = sizeof(struct channel);
+ shmsize = sizeof(struct lttng_ust_lib_ring_buffer_channel);
shmsize += lttng_ust_offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_shmp));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_shmp) * nr_streams;
chansize = shmsize;
-1, -1);
if (!shmobj)
goto error_append;
- /* struct channel is at object 0, offset 0 (hardcoded) */
+ /* struct lttng_ust_lib_ring_buffer_channel is at object 0, offset 0 (hardcoded) */
set_shmp(handle->chan, zalloc_shm(shmobj, chansize));
assert(handle->chan._ref.index == 0);
assert(handle->chan._ref.offset == 0);
memory_map_size, wakeup_fd);
if (!object)
goto error_table_object;
- /* struct channel is at object 0, offset 0 (hardcoded) */
+ /* struct lttng_ust_lib_ring_buffer_channel is at object 0, offset 0 (hardcoded) */
handle->chan._ref.index = 0;
handle->chan._ref.offset = 0;
return handle;
}
static
-void channel_release(struct channel *chan, struct lttng_ust_shm_handle *handle,
+void channel_release(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle,
int consumer)
{
channel_free(chan, handle, consumer);
* consumption of finalized channels, get_subbuf() will return -ENODATA.
* They should release their handle at that point.
*/
-void channel_destroy(struct channel *chan, struct lttng_ust_shm_handle *handle,
+void channel_destroy(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle,
int consumer)
{
if (consumer) {
struct lttng_ust_lib_ring_buffer *channel_get_ring_buffer(
const struct lttng_ust_lib_ring_buffer_config *config,
- struct channel *chan, int cpu,
+ struct lttng_ust_lib_ring_buffer_channel *chan, int cpu,
struct lttng_ust_shm_handle *handle,
int *shm_fd, int *wait_fd,
int *wakeup_fd,
}
int ring_buffer_channel_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle)
{
struct shm_ref *ref;
}
int ring_buffer_channel_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle)
{
struct shm_ref *ref;
}
int ring_buffer_stream_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle,
int cpu)
{
}
int ring_buffer_stream_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_shm_handle *handle,
int cpu)
{
void lib_ring_buffer_release_read(struct lttng_ust_lib_ring_buffer *buf,
struct lttng_ust_shm_handle *handle)
{
- struct channel *chan = shmp(handle, buf->backend.chan);
+ struct lttng_ust_lib_ring_buffer_channel *chan = shmp(handle, buf->backend.chan);
if (!chan)
return;
unsigned long *consumed, unsigned long *produced,
struct lttng_ust_shm_handle *handle)
{
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long consumed_cur, write_offset;
int finalized;
unsigned long *consumed, unsigned long *produced,
struct lttng_ust_shm_handle *handle)
{
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
const struct lttng_ust_lib_ring_buffer_config *config;
chan = shmp(handle, buf->backend.chan);
struct lttng_ust_shm_handle *handle)
{
struct lttng_ust_lib_ring_buffer_backend *bufb = &buf->backend;
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
unsigned long consumed;
chan = shmp(handle, bufb->chan);
unsigned long consumed,
struct lttng_ust_shm_handle *handle)
{
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long consumed_cur, consumed_idx, commit_count, write_offset;
int ret, finalized, nr_retry = LTTNG_UST_RING_BUFFER_GET_RETRY;
struct lttng_ust_shm_handle *handle)
{
struct lttng_ust_lib_ring_buffer_backend *bufb = &buf->backend;
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long sb_bindex, consumed_idx, consumed;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
*/
static
void lib_ring_buffer_print_subbuffer_errors(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
unsigned long cons_offset,
int cpu,
struct lttng_ust_shm_handle *handle)
static
void lib_ring_buffer_print_buffer_errors(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
void *priv, int cpu,
struct lttng_ust_shm_handle *handle)
{
}
static
-void lib_ring_buffer_print_errors(struct channel *chan,
+void lib_ring_buffer_print_errors(struct lttng_ust_lib_ring_buffer_channel *chan,
struct lttng_ust_lib_ring_buffer *buf, int cpu,
struct lttng_ust_shm_handle *handle)
{
*/
static
void lib_ring_buffer_switch_old_start(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct switch_offsets *offsets,
uint64_t tsc,
struct lttng_ust_shm_handle *handle)
*/
static
void lib_ring_buffer_switch_old_end(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct switch_offsets *offsets,
uint64_t tsc,
struct lttng_ust_shm_handle *handle)
*/
static
void lib_ring_buffer_switch_new_start(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct switch_offsets *offsets,
uint64_t tsc,
struct lttng_ust_shm_handle *handle)
*/
static
void lib_ring_buffer_switch_new_end(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct switch_offsets *offsets,
uint64_t tsc,
struct lttng_ust_shm_handle *handle)
static
int lib_ring_buffer_try_switch_slow(enum switch_mode mode,
struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct switch_offsets *offsets,
uint64_t *tsc,
struct lttng_ust_shm_handle *handle)
void lib_ring_buffer_switch_slow(struct lttng_ust_lib_ring_buffer *buf, enum switch_mode mode,
struct lttng_ust_shm_handle *handle)
{
- struct channel *chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan;
const struct lttng_ust_lib_ring_buffer_config *config;
struct switch_offsets offsets;
unsigned long oldidx;
*/
static
int lib_ring_buffer_try_reserve_slow(struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
struct switch_offsets *offsets,
struct lttng_ust_lib_ring_buffer_ctx *ctx,
void *client_ctx)
int lib_ring_buffer_reserve_slow(struct lttng_ust_lib_ring_buffer_ctx *ctx,
void *client_ctx)
{
- struct channel *chan = ctx->chan;
+ struct lttng_ust_lib_ring_buffer_channel *chan = ctx->chan;
struct lttng_ust_shm_handle *handle = ctx->handle;
const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config;
struct lttng_ust_lib_ring_buffer *buf;
void lib_ring_buffer_check_deliver_slow(const struct lttng_ust_lib_ring_buffer_config *config,
struct lttng_ust_lib_ring_buffer *buf,
- struct channel *chan,
+ struct lttng_ust_lib_ring_buffer_channel *chan,
unsigned long offset,
unsigned long commit_count,
unsigned long idx,