X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ring-buffer-metadata-client.h;h=05d3f1bb60ac2aac301dac61085f22eb32908359;hb=b4051ad8c170901d5297e1b3005b24e63cb0ab1e;hp=8bffe547bf43fae733c97149fc1b7ae74743b0cc;hpb=7dd08bec735b428479201f9f84d59c78deabdf57;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 8bffe547..05d3f1bb 100644 --- a/liblttng-ust/lttng-ring-buffer-metadata-client.h +++ b/liblttng-ust/lttng-ring-buffer-metadata-client.h @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include "lttng/bitfield.h" @@ -52,15 +53,17 @@ 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) + struct lttng_ust_lib_ring_buffer_ctx *ctx, + void *client_ctx) { return 0; } #include "../libringbuffer/api.h" +#include "lttng-rb-clients.h" static uint64_t client_ring_buffer_clock_read(struct channel *chan) { @@ -71,7 +74,8 @@ static size_t client_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) + struct lttng_ust_lib_ring_buffer_ctx *ctx, + void *client_ctx) { return 0; } @@ -100,6 +104,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 */ @@ -110,7 +117,6 @@ static void client_buffer_begin(struct lttng_ust_lib_ring_buffer *buf, uint64_t header->checksum_scheme = 0; /* 0 if unused */ header->major = CTF_SPEC_MAJOR; header->minor = CTF_SPEC_MINOR; - } /* @@ -129,6 +135,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 */ /* @@ -154,6 +163,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, @@ -173,9 +195,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, @@ -183,60 +207,55 @@ 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, - int **shm_fd, int **wait_fd, - uint64_t **memory_map_size, - struct lttng_channel *chan_priv_init) + unsigned char *uuid, + uint32_t chan_id, + const int *stream_fds, int nr_stream_fds, + int64_t blocking_timeout) { - void *priv; - struct lttng_channel *lttng_chan = NULL; + struct lttng_channel chan_priv_init; struct lttng_ust_shm_handle *handle; + struct lttng_channel *lttng_chan; + void *priv; + 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), - chan_priv_init, + &priv, __alignof__(struct lttng_channel), + sizeof(struct lttng_channel), + &chan_priv_init, buf_addr, subbuf_size, num_subbuf, switch_timer_interval, read_timer_interval, - shm_fd, wait_fd, memory_map_size); + stream_fds, nr_stream_fds, blocking_timeout); if (!handle) return NULL; lttng_chan = priv; lttng_chan->handle = handle; - lttng_chan->chan = shmp(lttng_chan->handle, lttng_chan->handle->chan); + lttng_chan->chan = shmp(handle, handle->chan); return lttng_chan; } static -void lttng_channel_destroy(struct lttng_channel *lttng_chan) -{ - channel_destroy(lttng_chan->chan, lttng_chan->handle, 0); -} - -static -struct lttng_ust_lib_ring_buffer *lttng_buffer_read_open(struct channel *chan, - struct lttng_ust_shm_handle *handle, - int **shm_fd, int **wait_fd, - uint64_t **memory_map_size) -{ - struct lttng_ust_lib_ring_buffer *buf; - - buf = channel_get_ring_buffer(&client_config, chan, - 0, handle, shm_fd, wait_fd, memory_map_size); - if (!lib_ring_buffer_open_read(buf, handle, 0)) - return buf; - return NULL; -} - -static -void lttng_buffer_read_close(struct lttng_ust_lib_ring_buffer *buf, - struct lttng_ust_shm_handle *handle) +void lttng_channel_destroy(struct lttng_channel *chan) { - lib_ring_buffer_release_read(buf, handle, 0); + channel_destroy(chan->chan, chan->handle, 1); } 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, NULL); + 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 @@ -299,11 +318,11 @@ static int lttng_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, wakeup_fd; + uint64_t memory_map_size; buf = channel_get_ring_buffer(&client_config, chan, - 0, handle, &shm_fd, &wait_fd, + 0, handle, &shm_fd, &wait_fd, &wakeup_fd, &memory_map_size); lib_ring_buffer_switch(&client_config, buf, SWITCH_ACTIVE, handle); @@ -315,8 +334,6 @@ static struct lttng_transport lttng_relay_transport = { .ops = { .channel_create = _channel_create, .channel_destroy = lttng_channel_destroy, - .buffer_read_open = lttng_buffer_read_open, - .buffer_read_close = lttng_buffer_read_close, .event_reserve = lttng_event_reserve, .event_commit = lttng_event_commit, .event_write = lttng_event_write, @@ -327,16 +344,19 @@ static struct lttng_transport lttng_relay_transport = { .is_disabled = lttng_is_disabled, .flush_buffer = lttng_flush_buffer, }, + .client_config = &client_config, }; void RING_BUFFER_MODE_TEMPLATE_INIT(void) { - DBG("LTT : ltt ring buffer client init\n"); + DBG("LTT : ltt ring buffer client \"%s\" init\n", + "relay-" RING_BUFFER_MODE_TEMPLATE_STRING "-mmap"); lttng_transport_register(<tng_relay_transport); } void RING_BUFFER_MODE_TEMPLATE_EXIT(void) { - DBG("LTT : ltt ring buffer client exit\n"); + DBG("LTT : ltt ring buffer client \"%s\" exit\n", + "relay-" RING_BUFFER_MODE_TEMPLATE_STRING "-mmap"); lttng_transport_unregister(<tng_relay_transport); }