enum lttng_bytecode_node_type {
LTTNG_BYTECODE_NODE_TYPE_FILTER,
+ LTTNG_BYTECODE_NODE_TYPE_CAPTURE,
};
struct lttng_bytecode_node {
/* Other bits are kept for future use. */
};
+struct lttng_interpreter_output;
+
struct lttng_bytecode_runtime {
/* Associated bytecode */
struct lttng_bytecode_node *bc;
uint64_t (*filter)(void *filter_data,
struct lttng_probe_ctx *lttng_probe_ctx,
const char *filter_stack_data);
+ uint64_t (*capture)(void *filter_data,
+ struct lttng_probe_ctx *lttng_probe_ctx,
+ const char *capture_stack_data,
+ struct lttng_interpreter_output *output);
} interpreter_funcs;
int link_failed;
struct list_head node; /* list of bytecode runtime in event */
struct hlist_node hlist; /* session ht of event_notifiers */
/* list of struct lttng_bytecode_runtime, sorted by seqnum */
struct list_head filter_bytecode_runtime_head;
+ size_t num_captures;
+ struct list_head capture_bytecode_runtime_head;
int has_enablers_without_bytecode;
- void (*send_notification)(struct lttng_event_notifier *event_notifier);
+ void (*send_notification)(struct lttng_event_notifier *event_notifier,
+ struct lttng_probe_ctx *lttng_probe_ctx,
+ const char *interpreter_stack_data);
struct lttng_event_notifier_group *group; /* Weak ref */
};
enum lttng_enabler_format_type format_type;
- /* head list of struct lttng_ust_filter_bytecode_node */
+ /* head list of struct lttng_bytecode_node */
struct list_head filter_bytecode_head;
struct lttng_kernel_event event_param;
struct lttng_enabler base;
struct list_head node; /* List of event_notifier enablers */
struct lttng_event_notifier_group *group;
+
+ /* head list of struct lttng_bytecode_node */
+ struct list_head capture_bytecode_head;
+ uint64_t num_captures;
};
+
static inline
struct lttng_enabler *lttng_event_enabler_as_enabler(
struct lttng_event_enabler *event_enabler)
uint64_t *id);
};
+struct lttng_counter_ops {
+ struct lib_counter *(*counter_create)(size_t nr_dimensions,
+ const size_t *max_nr_elem, /* for each dimension */
+ int64_t global_sum_step);
+ void (*counter_destroy)(struct lib_counter *counter);
+ int (*counter_add)(struct lib_counter *counter, const size_t *dimension_indexes,
+ int64_t v);
+ /*
+ * counter_read reads a specific cpu's counter if @cpu >= 0, or
+ * the global aggregation counter if @cpu == -1.
+ */
+ int (*counter_read)(struct lib_counter *counter, const size_t *dimension_indexes, int cpu,
+ int64_t *value, bool *overflow, bool *underflow);
+ /*
+ * counter_aggregate returns the total sum of all per-cpu counters and
+ * the global aggregation counter.
+ */
+ int (*counter_aggregate)(struct lib_counter *counter, const size_t *dimension_indexes,
+ int64_t *value, bool *overflow, bool *underflow);
+ int (*counter_clear)(struct lib_counter *counter, const size_t *dimension_indexes);
+};
+
struct lttng_transport {
char *name;
struct module *owner;
struct lttng_channel_ops ops;
};
+struct lttng_counter_transport {
+ char *name;
+ struct module *owner;
+ struct list_head node;
+ struct lttng_counter_ops ops;
+};
+
struct lttng_syscall_filter;
#define LTTNG_EVENT_HT_BITS 12
void lttng_transport_register(struct lttng_transport *transport);
void lttng_transport_unregister(struct lttng_transport *transport);
+void lttng_counter_transport_register(struct lttng_counter_transport *transport);
+void lttng_counter_transport_unregister(struct lttng_counter_transport *transport);
+
void synchronize_trace(void);
int lttng_abi_init(void);
int lttng_abi_compat_old_init(void);
int lttng_event_notifier_enabler_attach_filter_bytecode(
struct lttng_event_notifier_enabler *event_notifier_enabler,
struct lttng_kernel_filter_bytecode __user *bytecode);
+int lttng_event_notifier_enabler_attach_capture_bytecode(
+ struct lttng_event_notifier_enabler *event_notifier_enabler,
+ struct lttng_kernel_capture_bytecode __user *bytecode);
void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
struct lttng_ctx *ctx,