*/
} LTTNG_PACKED;
+
+enum lttng_ust_counter_arithmetic {
+ LTTNG_UST_COUNTER_ARITHMETIC_MODULAR = 0,
+ LTTNG_UST_COUNTER_ARITHMETIC_SATURATION = 1,
+};
+
+enum lttng_ust_counter_bitness {
+ LTTNG_UST_COUNTER_BITNESS_32BITS = 4,
+ LTTNG_UST_COUNTER_BITNESS_64BITS = 8,
+};
+
+struct lttng_ust_counter_dimension {
+ uint64_t size;
+ uint64_t underflow_index;
+ uint64_t overflow_index;
+ uint8_t has_underflow;
+ uint8_t has_overflow;
+} LTTNG_PACKED;
+
+#define LTTNG_UST_COUNTER_DIMENSION_MAX 8
+struct lttng_ust_counter_conf {
+ uint32_t arithmetic; /* enum lttng_ust_counter_arithmetic */
+ uint32_t bitness; /* enum lttng_ust_counter_bitness */
+ uint32_t number_dimensions;
+ int64_t global_sum_step;
+ struct lttng_ust_counter_dimension dimensions[LTTNG_UST_COUNTER_DIMENSION_MAX];
+} LTTNG_PACKED;
+
+struct lttng_ust_counter_value {
+ uint32_t number_dimensions;
+ uint64_t dimension_indexes[LTTNG_UST_COUNTER_DIMENSION_MAX];
+ int64_t value;
+} LTTNG_PACKED;
+
#define LTTNG_UST_EVENT_PADDING1 8
#define LTTNG_UST_EVENT_PADDING2 (LTTNG_UST_SYM_NAME_LEN + 32)
struct lttng_ust_event {
#define LTTNG_UST_EVENT_NOTIFIER_PADDING1 16
struct lttng_ust_event_notifier {
struct lttng_ust_event event;
+ uint64_t error_counter_index;
char padding[LTTNG_UST_EVENT_NOTIFIER_PADDING1];
} LTTNG_PACKED;
char padding[LTTNG_EVENT_NOTIFIER_NOTIFICATION_PADDING];
} LTTNG_PACKED;
+#define LTTNG_UST_COUNTER_PADDING1 (LTTNG_UST_SYM_NAME_LEN + 32)
+#define LTTNG_UST_COUNTER_DATA_MAX_LEN 4096U
+struct lttng_ust_counter {
+ uint64_t len;
+ char padding[LTTNG_UST_COUNTER_PADDING1];
+ char data[]; /* variable sized data */
+} LTTNG_PACKED;
+
+#define LTTNG_UST_COUNTER_GLOBAL_PADDING1 (LTTNG_UST_SYM_NAME_LEN + 32)
+struct lttng_ust_counter_global {
+ uint64_t len; /* shm len */
+ char padding[LTTNG_UST_COUNTER_GLOBAL_PADDING1];
+} LTTNG_PACKED;
+
+#define LTTNG_UST_COUNTER_CPU_PADDING1 (LTTNG_UST_SYM_NAME_LEN + 32)
+struct lttng_ust_counter_cpu {
+ uint64_t len; /* shm len */
+ uint32_t cpu_nr;
+ char padding[LTTNG_UST_COUNTER_CPU_PADDING1];
+} LTTNG_PACKED;
+
enum lttng_ust_field_type {
LTTNG_UST_FIELD_OTHER = 0,
LTTNG_UST_FIELD_INTEGER = 1,
LTTNG_UST_OBJECT_TYPE_CONTEXT = 3,
LTTNG_UST_OBJECT_TYPE_EVENT_NOTIFIER_GROUP = 4,
LTTNG_UST_OBJECT_TYPE_EVENT_NOTIFIER = 5,
+ LTTNG_UST_OBJECT_TYPE_COUNTER = 6,
+ LTTNG_UST_OBJECT_TYPE_COUNTER_GLOBAL = 7,
+ LTTNG_UST_OBJECT_TYPE_COUNTER_CPU = 8,
};
#define LTTNG_UST_OBJECT_DATA_PADDING1 32
int wakeup_fd;
uint32_t stream_nr;
} stream;
+ struct {
+ void *data;
+ } counter;
+ struct {
+ int shm_fd;
+ } counter_global;
+ struct {
+ int shm_fd;
+ uint32_t cpu_nr;
+ } counter_cpu;
char padding2[LTTNG_UST_OBJECT_DATA_PADDING2];
} u;
} LTTNG_PACKED;
_UST_CMDW(0xB0, struct lttng_ust_event_notifier)
#define LTTNG_UST_CAPTURE _UST_CMD(0xB1)
+/* Session and event notifier group commands */
+#define LTTNG_UST_COUNTER \
+ _UST_CMDW(0xC0, struct lttng_ust_counter)
+
+/* Counter commands */
+#define LTTNG_UST_COUNTER_GLOBAL \
+ _UST_CMDW(0xD0, struct lttng_ust_counter_global)
+#define LTTNG_UST_COUNTER_CPU \
+ _UST_CMDW(0xD1, struct lttng_ust_counter_cpu)
+
#define LTTNG_UST_ROOT_HANDLE 0
struct lttng_ust_obj;
struct {
int event_notifier_notif_fd;
} event_notifier_handle;
+ struct {
+ void *counter_data;
+ } counter;
+ struct {
+ int shm_fd;
+ } counter_shm;
};
struct lttng_ust_objd_ops {