X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Fust-events.h;h=7e70ea40e0b096c8c89fcc6b84c7928c2bb7b197;hb=10544ee8af31afb239e3dfa71cb2fe09d3de3771;hp=5bd158386cdfeba881597d5b1bc3c0b17076ee94;hpb=86133cafe8f32497f53f4b469b8d3357470e7080;p=lttng-ust.git diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 5bd15838..7e70ea40 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -64,6 +64,7 @@ struct lttng_session; struct lttng_ust_lib_ring_buffer_ctx; struct lttng_ust_context_app; struct lttng_event_field; +struct lttng_event_notifier_group; /* * Data structures used by tracepoint event declarations, and by the @@ -435,6 +436,8 @@ enum lttng_bytecode_interpreter_ret { /* Other bits are kept for future use. */ }; +struct lttng_interpreter_output; + /* * This structure is used in the probes. More specifically, the `filter` and * `node` fields are explicity used in the probes. When modifying this @@ -447,6 +450,9 @@ struct lttng_bytecode_runtime { union { uint64_t (*filter)(void *interpreter_data, const char *interpreter_stack_data); + uint64_t (*capture)(void *interpreter_data, + const char *interpreter_stack_data, + struct lttng_interpreter_output *interpreter_output); } interpreter_funcs; int link_failed; struct cds_list_head node; /* list of bytecode runtime in event */ @@ -505,9 +511,12 @@ struct lttng_event { struct lttng_event_notifier { uint64_t user_token; + uint64_t error_counter_index; int enabled; int registered; /* has reg'd tracepoint probe */ + size_t num_captures; /* Needed to allocate the msgpack array. */ struct cds_list_head filter_bytecode_runtime_head; + struct cds_list_head capture_bytecode_runtime_head; int has_enablers_without_bytecode; struct cds_list_head enablers_ref_head; const struct lttng_event_desc *desc; @@ -609,6 +618,36 @@ struct lttng_channel { int tstate:1; /* Transient enable state */ }; +#define LTTNG_COUNTER_DIMENSION_MAX 8 + +struct lttng_counter_dimension { + uint64_t size; + uint64_t underflow_index; + uint64_t overflow_index; + uint8_t has_underflow; + uint8_t has_overflow; +}; + +struct lttng_counter_ops { + struct lib_counter *(*counter_create)(size_t nr_dimensions, + const struct lttng_counter_dimension *dimensions, + int64_t global_sum_step, + int global_counter_fd, + int nr_counter_cpu_fds, + const int *counter_cpu_fds, + bool is_daemon); + void (*counter_destroy)(struct lib_counter *counter); + int (*counter_add)(struct lib_counter *counter, + const size_t *dimension_indexes, int64_t v); + int (*counter_read)(struct lib_counter *counter, + const size_t *dimension_indexes, int cpu, + int64_t *value, bool *overflow, bool *underflow); + 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); +}; + #define LTTNG_UST_STACK_CTX_PADDING 32 struct lttng_stack_ctx { struct lttng_event *event; @@ -670,6 +709,14 @@ struct lttng_session { struct lttng_ctx *ctx; /* contexts for filters. */ }; +struct lttng_counter { + int objd; + struct lttng_event_notifier_group *event_notifier_group; /* owner */ + struct lttng_counter_transport *transport; + struct lib_counter *counter; + struct lttng_counter_ops *ops; +}; + struct lttng_event_notifier_group { int objd; void *owner; @@ -679,6 +726,9 @@ struct lttng_event_notifier_group { struct cds_list_head event_notifiers_head; /* list of event_notifiers */ struct lttng_ust_event_notifier_ht event_notifiers_ht; /* hashtable of event_notifiers */ struct lttng_ctx *ctx; /* contexts for filters. */ + + struct lttng_counter *error_counter; + size_t error_counter_len; }; struct lttng_transport { @@ -688,6 +738,13 @@ struct lttng_transport { const struct lttng_ust_lib_ring_buffer_config *client_config; }; +struct lttng_counter_transport { + char *name; + struct cds_list_head node; + struct lttng_counter_ops ops; + const struct lib_counter_config *client_config; +}; + struct lttng_session *lttng_session_create(void); int lttng_session_enable(struct lttng_session *session); int lttng_session_disable(struct lttng_session *session); @@ -695,7 +752,8 @@ int lttng_session_statedump(struct lttng_session *session); void lttng_session_destroy(struct lttng_session *session); void lttng_event_notifier_notification_send( - struct lttng_event_notifier *event_notifier); + struct lttng_event_notifier *event_notifier, + const char *stack_data); struct lttng_channel *lttng_channel_create(struct lttng_session *session, const char *transport_name, @@ -716,7 +774,12 @@ int lttng_attach_context(struct lttng_ust_context *context_param, void lttng_transport_register(struct lttng_transport *transport); void lttng_transport_unregister(struct lttng_transport *transport); -void synchronize_trace(void); +void lttng_counter_transport_register(struct lttng_counter_transport *transport); +void lttng_counter_transport_unregister(struct lttng_counter_transport *transport); + +struct lttng_counter *lttng_ust_counter_create( + const char *counter_transport_name, + size_t number_dimensions, const struct lttng_counter_dimension *dimensions); int lttng_probe_register(struct lttng_probe_desc *desc); void lttng_probe_unregister(struct lttng_probe_desc *desc); @@ -802,6 +865,7 @@ extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_cal extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_overwrite; struct lttng_transport *lttng_transport_find(const char *name); +struct lttng_counter_transport *lttng_counter_transport_find(const char *name); int lttng_probes_get_event_list(struct lttng_ust_tracepoint_list *list); void lttng_probes_prune_event_list(struct lttng_ust_tracepoint_list *list);