cleanup: explicitly mark unused parameters (-Wunused-parameter)
[lttng-ust.git] / libringbuffer / backend.h
index 46022ad3c5767d7f46db917ee41d2f6e72a98c7b..0b482182a59b0400d60386a599ee8df26cd2959b 100644 (file)
@@ -1,31 +1,18 @@
-#ifndef _LTTNG_RING_BUFFER_BACKEND_H
-#define _LTTNG_RING_BUFFER_BACKEND_H
-
 /*
- * libringbuffer/backend.h
- *
- * Ring buffer backend (API).
+ * SPDX-License-Identifier: LGPL-2.1-only
  *
  * Copyright (C) 2011-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 backend (API).
  *
  * Credits to Steven Rostedt for proposing to use an extra-subbuffer owned by
  * the reader in flight recorder mode.
  */
 
+#ifndef _LTTNG_RING_BUFFER_BACKEND_H
+#define _LTTNG_RING_BUFFER_BACKEND_H
+
+#include <stddef.h>
 #include <unistd.h>
 
 /* Internal helpers */
 
 extern size_t lib_ring_buffer_read(struct lttng_ust_lib_ring_buffer_backend *bufb,
                                   size_t offset, void *dest, size_t len,
-                                  struct lttng_ust_shm_handle *handle);
+                                  struct lttng_ust_shm_handle *handle)
+       __attribute__((visibility("hidden")));
 
 extern int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *bufb,
                                     size_t offset, void *dest, size_t len,
-                                    struct lttng_ust_shm_handle *handle);
+                                    struct lttng_ust_shm_handle *handle)
+       __attribute__((visibility("hidden")));
 
 /*
  * Return the address where a given offset is located.
@@ -53,11 +42,14 @@ extern int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *b
 extern void *
 lib_ring_buffer_offset_address(struct lttng_ust_lib_ring_buffer_backend *bufb,
                               size_t offset,
-                              struct lttng_ust_shm_handle *handle);
+                              struct lttng_ust_shm_handle *handle)
+       __attribute__((visibility("hidden")));
+
 extern void *
 lib_ring_buffer_read_offset_address(struct lttng_ust_lib_ring_buffer_backend *bufb,
                                    size_t offset,
-                                   struct lttng_ust_shm_handle *handle);
+                                   struct lttng_ust_shm_handle *handle)
+       __attribute__((visibility("hidden")));
 
 /**
  * lib_ring_buffer_write - write data to a buffer backend
@@ -71,14 +63,20 @@ lib_ring_buffer_read_offset_address(struct lttng_ust_lib_ring_buffer_backend *bu
  * backend-specific memcpy() operation. Calls the slow path (_ring_buffer_write)
  * if copy is crossing a page boundary.
  */
-static inline __attribute__((always_inline))
+static inline
+void lib_ring_buffer_write(const struct lttng_ust_lib_ring_buffer_config *config,
+                          struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                          const void *src, size_t len)
+       __attribute__((always_inline));
+static inline
 void lib_ring_buffer_write(const struct lttng_ust_lib_ring_buffer_config *config,
                           struct lttng_ust_lib_ring_buffer_ctx *ctx,
                           const void *src, size_t len)
 {
-       struct channel_backend *chanb = &ctx->chan->backend;
-       struct lttng_ust_shm_handle *handle = ctx->handle;
-       size_t offset = ctx->buf_offset;
+       struct lttng_ust_lib_ring_buffer_ctx_private *ctx_private = ctx->priv;
+       struct channel_backend *chanb = &ctx_private->chan->backend;
+       struct lttng_ust_shm_handle *handle = ctx_private->chan->handle;
+       size_t offset = ctx_private->buf_offset;
        struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
        void *p;
 
@@ -98,7 +96,7 @@ void lib_ring_buffer_write(const struct lttng_ust_lib_ring_buffer_config *config
        if (caa_unlikely(!p))
                return;
        lib_ring_buffer_do_copy(config, p, src, len);
-       ctx->buf_offset += len;
+       ctx_private->buf_offset += len;
 }
 
 /*
@@ -106,9 +104,14 @@ void lib_ring_buffer_write(const struct lttng_ust_lib_ring_buffer_config *config
  * terminating character is found in @src. Returns the number of bytes
  * copied. Does *not* terminate @dest with NULL terminating character.
  */
-static inline __attribute__((always_inline))
+static inline
 size_t lib_ring_buffer_do_strcpy(const struct lttng_ust_lib_ring_buffer_config *config,
                char *dest, const char *src, size_t len)
+       __attribute__((always_inline));
+static inline
+size_t lib_ring_buffer_do_strcpy(
+               const struct lttng_ust_lib_ring_buffer_config *config  __attribute__((unused)),
+               char *dest, const char *src, size_t len)
 {
        size_t count;
 
@@ -142,15 +145,21 @@ size_t lib_ring_buffer_do_strcpy(const struct lttng_ust_lib_ring_buffer_config *
  * character is found in @src before @len - 1 characters are copied, pad
  * the buffer with @pad characters (e.g. '#').
  */
-static inline __attribute__((always_inline))
+static inline
 void lib_ring_buffer_strcpy(const struct lttng_ust_lib_ring_buffer_config *config,
                           struct lttng_ust_lib_ring_buffer_ctx *ctx,
-                          const char *src, size_t len, int pad)
+                          const char *src, size_t len, char pad)
+       __attribute__((always_inline));
+static inline
+void lib_ring_buffer_strcpy(const struct lttng_ust_lib_ring_buffer_config *config,
+                          struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                          const char *src, size_t len, char pad)
 {
-       struct channel_backend *chanb = &ctx->chan->backend;
-       struct lttng_ust_shm_handle *handle = ctx->handle;
+       struct lttng_ust_lib_ring_buffer_ctx_private *ctx_private = ctx->priv;
+       struct channel_backend *chanb = &ctx_private->chan->backend;
+       struct lttng_ust_shm_handle *handle = ctx_private->chan->handle;
        size_t count;
-       size_t offset = ctx->buf_offset;
+       size_t offset = ctx_private->buf_offset;
        struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
        void *p;
 
@@ -187,7 +196,71 @@ void lib_ring_buffer_strcpy(const struct lttng_ust_lib_ring_buffer_config *confi
        if (caa_unlikely(!p))
                return;
        lib_ring_buffer_do_memset(p, '\0', 1);
-       ctx->buf_offset += len;
+       ctx_private->buf_offset += len;
+}
+
+/**
+ * lib_ring_buffer_pstrcpy - write to a buffer backend P-string
+ * @config : ring buffer instance configuration
+ * @ctx: ring buffer context. (input arguments only)
+ * @src : source pointer to copy from
+ * @len : length of data to copy
+ * @pad : character to use for padding
+ *
+ * This function copies up to @len bytes of data from a source pointer
+ * to a Pascal String into the buffer backend. If a terminating '\0'
+ * character is found in @src before @len characters are copied, pad the
+ * buffer with @pad characters (e.g.  '\0').
+ *
+ * The length of the pascal strings in the ring buffer is explicit: it
+ * is either the array or sequence length.
+ */
+static inline
+void lib_ring_buffer_pstrcpy(const struct lttng_ust_lib_ring_buffer_config *config,
+                          struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                          const char *src, size_t len, char pad)
+       __attribute__((always_inline));
+static inline
+void lib_ring_buffer_pstrcpy(const struct lttng_ust_lib_ring_buffer_config *config,
+                          struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                          const char *src, size_t len, char pad)
+{
+       struct lttng_ust_lib_ring_buffer_ctx_private *ctx_private = ctx->priv;
+       struct channel_backend *chanb = &ctx_private->chan->backend;
+       struct lttng_ust_shm_handle *handle = ctx_private->chan->handle;
+       size_t count;
+       size_t offset = ctx_private->buf_offset;
+       struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
+       void *p;
+
+       if (caa_unlikely(!len))
+               return;
+       /*
+        * Underlying layer should never ask for writes across
+        * subbuffers.
+        */
+       CHAN_WARN_ON(chanb, (offset & (chanb->buf_size - 1)) + len > chanb->buf_size);
+       backend_pages = lib_ring_buffer_get_backend_pages_from_ctx(config, ctx);
+       if (caa_unlikely(!backend_pages)) {
+               if (lib_ring_buffer_backend_get_pages(config, ctx, &backend_pages))
+                       return;
+       }
+       p = shmp_index(handle, backend_pages->p, offset & (chanb->subbuf_size - 1));
+       if (caa_unlikely(!p))
+               return;
+
+       count = lib_ring_buffer_do_strcpy(config, p, src, len);
+       offset += count;
+       /* Padding */
+       if (caa_unlikely(count < len)) {
+               size_t pad_len = len - count;
+
+               p = shmp_index(handle, backend_pages->p, offset & (chanb->subbuf_size - 1));
+               if (caa_unlikely(!p))
+                       return;
+               lib_ring_buffer_do_memset(p, pad, pad_len);
+       }
+       ctx_private->buf_offset += len;
 }
 
 /*
@@ -204,7 +277,7 @@ unsigned long lib_ring_buffer_get_records_unread(
        struct lttng_ust_lib_ring_buffer_backend *bufb = &buf->backend;
        unsigned long records_unread = 0, sb_bindex;
        unsigned int i;
-       struct channel *chan;
+       struct lttng_ust_lib_ring_buffer_channel *chan;
 
        chan = shmp(handle, bufb->chan);
        if (!chan)
This page took 0.025036 seconds and 4 git commands to generate.