Fix: pass private data to context callbacks
[lttng-ust.git] / libringbuffer / frontend_types.h
index 01fdaccfce73a619393316bc47e257ae2e69f320..4e7d2e8f7526bcca829161b683af1fed2d60c277 100644 (file)
@@ -26,6 +26,8 @@
 #include "shm_types.h"
 #include "vatomic.h"
 
+#define LIB_RING_BUFFER_MAX_NESTING    5
+
 /*
  * A switch is done during tracing or as a final flush after tracing (so it
  * won't write in the new sub-buffer).
@@ -52,13 +54,14 @@ struct lttng_ust_lib_ring_buffer_channel {
        int read_timer_enabled;
 
        int finalized;                          /* Has channel been finalized */
-       size_t priv_data_offset;
+       size_t priv_data_offset;                /* Offset of private data channel config */
        unsigned int nr_streams;                /* Number of streams */
        struct lttng_ust_shm_handle *handle;
        /* Extended options. */
        union {
                struct {
                        int32_t blocking_timeout_ms;
+                       void *priv;             /* Private data pointer. */
                } s;
                char padding[RB_CHANNEL_PADDING];
        } u;
@@ -222,12 +225,61 @@ struct lttng_ust_lib_ring_buffer {
        char padding[RB_RING_BUFFER_PADDING];
 } __attribute__((aligned(CAA_CACHE_LINE_SIZE)));
 
+/*
+ * ring buffer private context
+ *
+ * Private context passed to lib_ring_buffer_reserve(), lib_ring_buffer_commit(),
+ * lib_ring_buffer_try_discard_reserve(), lttng_ust_lib_ring_buffer_align_ctx() and
+ * lib_ring_buffer_write().
+ *
+ * This context is allocated on an internal shadow-stack by a successful reserve
+ * operation, used by align/write, and freed by commit.
+ */
+
+struct lttng_ust_lib_ring_buffer_ctx_private {
+       /* input received by lib_ring_buffer_reserve(). */
+       struct lttng_ust_lib_ring_buffer_ctx *pub;
+       struct lttng_ust_lib_ring_buffer_channel *chan; /* channel */
+
+       /* output from lib_ring_buffer_reserve() */
+       int reserve_cpu;                        /* processor id updated by the reserve */
+       size_t slot_size;                       /* size of the reserved slot */
+       unsigned long buf_offset;               /* offset following the record header */
+       unsigned long pre_offset;               /*
+                                                * Initial offset position _before_
+                                                * the record is written. Positioned
+                                                * prior to record header alignment
+                                                * padding.
+                                                */
+       uint64_t tsc;                           /* time-stamp counter value */
+       unsigned int rflags;                    /* reservation flags */
+       void *ip;                               /* caller ip address */
+
+       struct lttng_ust_lib_ring_buffer *buf;  /*
+                                                * buffer corresponding to processor id
+                                                * for this channel
+                                                */
+       struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
+};
+
 static inline
-void *channel_get_private(struct lttng_ust_lib_ring_buffer_channel *chan)
+void *channel_get_private_config(struct lttng_ust_lib_ring_buffer_channel *chan)
 {
        return ((char *) chan) + chan->priv_data_offset;
 }
 
+static inline
+void *channel_get_private(struct lttng_ust_lib_ring_buffer_channel *chan)
+{
+       return chan->u.s.priv;
+}
+
+static inline
+void channel_set_private(struct lttng_ust_lib_ring_buffer_channel *chan, void *priv)
+{
+       chan->u.s.priv = priv;
+}
+
 #ifndef __rb_same_type
 #define __rb_same_type(a, b)   __builtin_types_compatible_p(typeof(a), typeof(b))
 #endif
@@ -257,4 +309,22 @@ void *channel_get_private(struct lttng_ust_lib_ring_buffer_channel *chan)
                _____ret = _____ret; /* For clang "unused result". */   \
        })
 
+/**
+ * lttng_ust_lib_ring_buffer_align_ctx - Align context offset on "alignment"
+ * @ctx: ring buffer context.
+ */
+static inline
+void lttng_ust_lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                          size_t alignment)
+       lttng_ust_notrace;
+static inline
+void lttng_ust_lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                          size_t alignment)
+{
+       struct lttng_ust_lib_ring_buffer_ctx_private *ctx_private = ctx->priv;
+
+       ctx_private->buf_offset += lttng_ust_lib_ring_buffer_align(ctx_private->buf_offset,
+                                                alignment);
+}
+
 #endif /* _LTTNG_RING_BUFFER_FRONTEND_TYPES_H */
This page took 0.024811 seconds and 4 git commands to generate.