* Dual LGPL v2.1/GPL v2 license.
*/
+#define _GNU_SOURCE
#include <stdint.h>
#include <lttng/ust-events.h>
#include "lttng/bitfield.h"
static const struct lttng_ust_lib_ring_buffer_config client_config;
-static inline
-u64 lib_ring_buffer_clock_read(struct channel *chan)
+static inline uint64_t lib_ring_buffer_clock_read(struct channel *chan)
{
return 0;
}
#include "../libringbuffer/api.h"
-static u64 client_ring_buffer_clock_read(struct channel *chan)
+static uint64_t client_ring_buffer_clock_read(struct channel *chan)
{
return 0;
}
return offsetof(struct metadata_packet_header, header_end);
}
-static void client_buffer_begin(struct lttng_ust_lib_ring_buffer *buf, u64 tsc,
+static void client_buffer_begin(struct lttng_ust_lib_ring_buffer *buf, uint64_t tsc,
unsigned int subbuf_idx,
struct lttng_ust_shm_handle *handle)
{
subbuf_idx * chan->backend.subbuf_size,
handle);
struct ltt_channel *ltt_chan = channel_get_private(chan);
- struct ltt_session *session = ltt_chan->session;
header->magic = TSDL_MAGIC_NUMBER;
- memcpy(header->uuid, session->uuid, sizeof(session->uuid));
+ memcpy(header->uuid, ltt_chan->uuid, sizeof(ltt_chan->uuid));
header->checksum = 0; /* 0 if unused */
header->content_size = 0xFFFFFFFF; /* in bits, for debugging */
header->packet_size = 0xFFFFFFFF; /* in bits, for debugging */
* offset is assumed to never be 0 here : never deliver a completely empty
* subbuffer. data_size is between 1 and subbuf_size.
*/
-static void client_buffer_end(struct lttng_ust_lib_ring_buffer *buf, u64 tsc,
+static void client_buffer_end(struct lttng_ust_lib_ring_buffer *buf, uint64_t tsc,
unsigned int subbuf_idx, unsigned long data_size,
struct lttng_ust_shm_handle *handle)
{
.oops = RING_BUFFER_OOPS_CONSISTENCY,
.ipi = RING_BUFFER_NO_IPI_BARRIER,
.wakeup = RING_BUFFER_WAKEUP_BY_WRITER,
+ .client_type = LTTNG_CLIENT_TYPE,
};
+const struct lttng_ust_lib_ring_buffer_client_cb *LTTNG_CLIENT_CALLBACKS = &client_config.cb;
+
static
struct ltt_channel *_channel_create(const char *name,
- struct ltt_channel *ltt_chan, void *buf_addr,
+ void *buf_addr,
size_t subbuf_size, size_t num_subbuf,
unsigned int switch_timer_interval,
unsigned int read_timer_interval,
- int *shm_fd, int *wait_fd,
- uint64_t *memory_map_size)
+ int **shm_fd, int **wait_fd,
+ uint64_t **memory_map_size,
+ struct ltt_channel *chan_priv_init)
{
- ltt_chan->handle = channel_create(&client_config, name, ltt_chan, buf_addr,
- subbuf_size, num_subbuf, switch_timer_interval,
- read_timer_interval, shm_fd, wait_fd,
- memory_map_size);
- if (!ltt_chan->handle)
+ void *priv;
+ struct ltt_channel *ltt_chan = NULL;
+ struct lttng_ust_shm_handle *handle;
+
+ handle = channel_create(&client_config, name,
+ &priv, __alignof__(*ltt_chan), sizeof(*ltt_chan),
+ chan_priv_init,
+ buf_addr, subbuf_size, num_subbuf,
+ switch_timer_interval, read_timer_interval,
+ shm_fd, wait_fd, memory_map_size);
+ if (!handle)
return NULL;
+ ltt_chan = priv;
+ ltt_chan->handle = handle;
ltt_chan->chan = shmp(ltt_chan->handle, ltt_chan->handle->chan);
return ltt_chan;
}
static
struct lttng_ust_lib_ring_buffer *ltt_buffer_read_open(struct channel *chan,
struct lttng_ust_shm_handle *handle,
- int *shm_fd, int *wait_fd,
- uint64_t *memory_map_size)
+ int **shm_fd, int **wait_fd,
+ uint64_t **memory_map_size)
{
struct lttng_ust_lib_ring_buffer *buf;
int ltt_flush_buffer(struct channel *chan, struct lttng_ust_shm_handle *handle)
{
struct lttng_ust_lib_ring_buffer *buf;
- int shm_fd, wait_fd;
- uint64_t memory_map_size;
+ int *shm_fd, *wait_fd;
+ uint64_t *memory_map_size;
buf = channel_get_ring_buffer(&client_config, chan,
0, handle, &shm_fd, &wait_fd,