X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ring-buffer-metadata-client.h;h=00876b526eeb3bed87d39b2599cece86045c14ca;hb=9050321d9d15e530dcb6baf539b53023cf114247;hp=5c82187d4311d9f496b188d6e54c735dbbbf86f0;hpb=34a91bdb42a2a3b01b687ab5e1ba7638401e6dfc;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ring-buffer-metadata-client.h b/liblttng-ust/lttng-ring-buffer-metadata-client.h index 5c82187d..00876b52 100644 --- a/liblttng-ust/lttng-ring-buffer-metadata-client.h +++ b/liblttng-ust/lttng-ring-buffer-metadata-client.h @@ -52,7 +52,7 @@ static inline uint64_t lib_ring_buffer_clock_read(struct channel *chan) } static inline -unsigned char record_header_size(const struct lttng_ust_lib_ring_buffer_config *config, +size_t record_header_size(const struct lttng_ust_lib_ring_buffer_config *config, struct channel *chan, size_t offset, size_t *pre_header_padding, struct lttng_ust_lib_ring_buffer_ctx *ctx) @@ -61,6 +61,7 @@ unsigned char record_header_size(const struct lttng_ust_lib_ring_buffer_config * } #include "../libringbuffer/api.h" +#include "lttng-rb-clients.h" static uint64_t client_ring_buffer_clock_read(struct channel *chan) { @@ -100,6 +101,9 @@ static void client_buffer_begin(struct lttng_ust_lib_ring_buffer *buf, uint64_t handle); struct lttng_channel *lttng_chan = channel_get_private(chan); + assert(header); + if (!header) + return; header->magic = TSDL_MAGIC_NUMBER; memcpy(header->uuid, lttng_chan->uuid, sizeof(lttng_chan->uuid)); header->checksum = 0; /* 0 if unused */ @@ -128,6 +132,9 @@ static void client_buffer_end(struct lttng_ust_lib_ring_buffer *buf, uint64_t ts handle); unsigned long records_lost = 0; + assert(header); + if (!header) + return; header->content_size = data_size * CHAR_BIT; /* in bits */ header->packet_size = PAGE_ALIGN(data_size) * CHAR_BIT; /* in bits */ /* @@ -153,6 +160,19 @@ static void client_buffer_finalize(struct lttng_ust_lib_ring_buffer *buf, { } +static const +struct lttng_ust_client_lib_ring_buffer_client_cb client_cb = { + .parent = { + .ring_buffer_clock_read = client_ring_buffer_clock_read, + .record_header_size = client_record_header_size, + .subbuffer_header_size = client_packet_header_size, + .buffer_begin = client_buffer_begin, + .buffer_end = client_buffer_end, + .buffer_create = client_buffer_create, + .buffer_finalize = client_buffer_finalize, + }, +}; + static const struct lttng_ust_lib_ring_buffer_config client_config = { .cb.ring_buffer_clock_read = client_ring_buffer_clock_read, .cb.record_header_size = client_record_header_size, @@ -172,9 +192,11 @@ static const struct lttng_ust_lib_ring_buffer_config client_config = { .ipi = RING_BUFFER_NO_IPI_BARRIER, .wakeup = RING_BUFFER_WAKEUP_BY_WRITER, .client_type = LTTNG_CLIENT_TYPE, + + .cb_ptr = &client_cb.parent, }; -const struct lttng_ust_lib_ring_buffer_client_cb *LTTNG_CLIENT_CALLBACKS = &client_config.cb; +const struct lttng_ust_client_lib_ring_buffer_client_cb *LTTNG_CLIENT_CALLBACKS = &client_cb; static struct lttng_channel *_channel_create(const char *name, @@ -182,7 +204,10 @@ struct lttng_channel *_channel_create(const char *name, size_t subbuf_size, size_t num_subbuf, unsigned int switch_timer_interval, unsigned int read_timer_interval, - unsigned char *uuid) + unsigned char *uuid, + uint32_t chan_id, + const int *stream_fds, int nr_stream_fds, + int64_t blocking_timeout) { struct lttng_channel chan_priv_init; struct lttng_ust_shm_handle *handle; @@ -191,11 +216,14 @@ struct lttng_channel *_channel_create(const char *name, memset(&chan_priv_init, 0, sizeof(chan_priv_init)); memcpy(chan_priv_init.uuid, uuid, LTTNG_UST_UUID_LEN); + chan_priv_init.id = chan_id; handle = channel_create(&client_config, name, - &priv, __alignof__(*lttng_chan), sizeof(*lttng_chan), + &priv, __alignof__(struct lttng_channel), + sizeof(struct lttng_channel), &chan_priv_init, buf_addr, subbuf_size, num_subbuf, - switch_timer_interval, read_timer_interval); + switch_timer_interval, read_timer_interval, + stream_fds, nr_stream_fds, blocking_timeout); if (!handle) return NULL; lttng_chan = priv; @@ -213,7 +241,18 @@ void lttng_channel_destroy(struct lttng_channel *chan) static int lttng_event_reserve(struct lttng_ust_lib_ring_buffer_ctx *ctx, uint32_t event_id) { - return lib_ring_buffer_reserve(&client_config, ctx); + int ret; + + ret = lib_ring_buffer_reserve(&client_config, ctx); + if (ret) + return ret; + if (caa_likely(ctx->ctx_len + >= sizeof(struct lttng_ust_lib_ring_buffer_ctx))) { + if (lib_ring_buffer_backend_get_pages(&client_config, ctx, + &ctx->backend_pages)) + return -EPERM; + } + return 0; } static