From 82b9bde830eff824adf7762afb7cb05c39bc83e3 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Thu, 19 Sep 2013 13:51:53 -0400 Subject: [PATCH] Specialize lttng_ust_lib_ring_buffer_client_cb Prepare the ring-buffer config to have custom callbacks. These custom callbacks are not related to the ring-buffer operations but allow applications to add custom functions. No additional feature or change in behaviour in this patch. Signed-off-by: Julien Desfossez Acked-by: Mathieu Desnoyers Signed-off-by: Mathieu Desnoyers --- include/lttng/ringbuffer-config.h | 4 ++- include/lttng/ust-events.h | 6 ++--- liblttng-ust/Makefile.am | 1 + liblttng-ust/lttng-rb-clients.h | 26 +++++++++++++++++++ liblttng-ust/lttng-ring-buffer-client.h | 18 ++++++++++++- .../lttng-ring-buffer-metadata-client.h | 18 ++++++++++++- 6 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 liblttng-ust/lttng-rb-clients.h diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h index 3b7d348a..9de9a738 100644 --- a/include/lttng/ringbuffer-config.h +++ b/include/lttng/ringbuffer-config.h @@ -133,7 +133,7 @@ struct lttng_ust_lib_ring_buffer_client_cb { * RING_BUFFER_WAKEUP_NONE does not perform any wakeup whatsoever. The client * has the responsibility to perform wakeups. */ -#define LTTNG_UST_RING_BUFFER_CONFIG_PADDING 32 +#define LTTNG_UST_RING_BUFFER_CONFIG_PADDING 20 enum lttng_ust_lib_ring_buffer_alloc_types { RING_BUFFER_ALLOC_PER_CPU, @@ -204,6 +204,8 @@ struct lttng_ust_lib_ring_buffer_config { * callbacks and update the cb pointers. */ int client_type; + int _unused1; + const struct lttng_ust_lib_ring_buffer_client_cb *cb_ptr; char padding[LTTNG_UST_RING_BUFFER_CONFIG_PADDING]; }; diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index f40c0448..74a3bc65 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -569,9 +569,9 @@ int lttng_add_ip_to_ctx(struct lttng_ctx **ctx); void lttng_context_vtid_reset(void); void lttng_context_vpid_reset(void); -extern const struct lttng_ust_lib_ring_buffer_client_cb *lttng_client_callbacks_metadata; -extern const struct lttng_ust_lib_ring_buffer_client_cb *lttng_client_callbacks_discard; -extern const struct lttng_ust_lib_ring_buffer_client_cb *lttng_client_callbacks_overwrite; +extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_metadata; +extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_discard; +extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_overwrite; struct lttng_transport *lttng_transport_find(const char *name); diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am index f06571cc..a3333139 100644 --- a/liblttng-ust/Makefile.am +++ b/liblttng-ust/Makefile.am @@ -47,6 +47,7 @@ liblttng_ust_support_la_SOURCES = \ lttng-tracer.h \ lttng-tracer-core.h \ ust-core.c \ + lttng-rb-clients.h \ lttng-ring-buffer-client.h \ lttng-ring-buffer-client-discard.c \ lttng-ring-buffer-client-discard-rt.c \ diff --git a/liblttng-ust/lttng-rb-clients.h b/liblttng-ust/lttng-rb-clients.h new file mode 100644 index 00000000..c9a16197 --- /dev/null +++ b/liblttng-ust/lttng-rb-clients.h @@ -0,0 +1,26 @@ +#ifndef _LTTNG_RB_CLIENT_H +#define _LTTNG_RB_CLIENT_H + +/* + * Copyright (c) 2013 - Mathieu Desnoyers + * + * 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 + */ + +struct lttng_ust_client_lib_ring_buffer_client_cb { + struct lttng_ust_lib_ring_buffer_client_cb parent; +}; + +#endif /* _LTTNG_RB_CLIENT_H */ diff --git a/liblttng-ust/lttng-ring-buffer-client.h b/liblttng-ust/lttng-ring-buffer-client.h index 72b6d2c8..383fce01 100644 --- a/liblttng-ust/lttng-ring-buffer-client.h +++ b/liblttng-ust/lttng-ring-buffer-client.h @@ -161,6 +161,7 @@ unsigned char record_header_size(const struct lttng_ust_lib_ring_buffer_config * } #include "../libringbuffer/api.h" +#include "lttng-rb-clients.h" static void lttng_write_event_header_slow(const struct lttng_ust_lib_ring_buffer_config *config, @@ -385,6 +386,19 @@ static void client_buffer_finalize(struct lttng_ust_lib_ring_buffer *buf, void * { } +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, @@ -404,9 +418,11 @@ static const struct lttng_ust_lib_ring_buffer_config client_config = { .ipi = RING_BUFFER_NO_IPI_BARRIER, .wakeup = LTTNG_CLIENT_WAKEUP, .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, diff --git a/liblttng-ust/lttng-ring-buffer-metadata-client.h b/liblttng-ust/lttng-ring-buffer-metadata-client.h index 89f2620c..0d2a1f83 100644 --- a/liblttng-ust/lttng-ring-buffer-metadata-client.h +++ b/liblttng-ust/lttng-ring-buffer-metadata-client.h @@ -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) { @@ -153,6 +154,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 +186,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, -- 2.34.1