X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Fust-events-internal.h;h=e9f14fc480e2139bdfe68b6b8edea742b0e8b696;hb=a9d86fd1c36a680eac282bd982896f78631af3ab;hp=01b13c4400d678b8996c81380bff8513a1661587;hpb=ddabe860f4cf41a4206a8157d83e6b9354f85cb5;p=lttng-ust.git diff --git a/liblttng-ust/ust-events-internal.h b/liblttng-ust/ust-events-internal.h index 01b13c44..e9f14fc4 100644 --- a/liblttng-ust/ust-events-internal.h +++ b/liblttng-ust/ust-events-internal.h @@ -14,8 +14,11 @@ #include +#include +#include "ust-context-provider.h" struct lttng_ust_abi_obj; +struct lttng_event_notifier_group; union lttng_ust_abi_args { struct { @@ -78,7 +81,7 @@ struct lttng_event_enabler { * Unused, but kept around to make it explicit that the tracer can do * it. */ - struct lttng_ctx *ctx; + struct lttng_ust_ctx *ctx; }; struct lttng_event_notifier_enabler { @@ -219,7 +222,7 @@ struct lttng_event_notifier_group { struct cds_list_head enablers_head; 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_ust_ctx *ctx; /* contexts for filters. */ struct lttng_counter *error_counter; size_t error_counter_len; @@ -242,7 +245,7 @@ struct lttng_counter_transport { struct lttng_ust_event_common_private { struct lttng_ust_event_common *pub; /* Public event interface */ - const struct lttng_ust_event_desc *desc; + struct lttng_ust_event_desc *desc; /* Backward references: list of lttng_enabler_ref (ref to enablers) */ struct cds_list_head enablers_ref_head; int registered; /* has reg'd tracepoint probe */ @@ -277,11 +280,11 @@ struct lttng_ust_bytecode_runtime_private { * Pointer to a URCU-protected pointer owned by an `struct * lttng_session`or `struct lttng_event_notifier_group`. */ - struct lttng_ctx **pctx; + struct lttng_ust_ctx **pctx; }; struct lttng_ust_session_private { - struct lttng_session *pub; /* Public session interface */ + struct lttng_ust_session *pub; /* Public session interface */ int been_active; /* Been active ? */ int objd; /* Object associated */ @@ -302,17 +305,201 @@ struct lttng_ust_session_private { /* New UST 2.8 */ struct lttng_ust_enum_ht enums_ht; /* ht of enumerations */ struct cds_list_head enums_head; - struct lttng_ctx *ctx; /* contexts for filters. */ + struct lttng_ust_ctx *ctx; /* contexts for filters. */ }; struct lttng_enum { - const struct lttng_ust_enum_desc *desc; - struct lttng_session *session; + struct lttng_ust_enum_desc *desc; + struct lttng_ust_session *session; struct cds_list_head node; /* Enum list in session */ struct cds_hlist_node hlist; /* Session ht of enums */ uint64_t id; /* Enumeration ID in sessiond */ }; +struct lttng_ust_channel_ops_private { + struct lttng_ust_channel_ops *pub; /* Public channels ops interface */ + + struct lttng_channel *(*channel_create)(const char *name, + void *buf_addr, + size_t subbuf_size, size_t num_subbuf, + unsigned int switch_timer_interval, + unsigned int read_timer_interval, + unsigned char *uuid, + uint32_t chan_id, + const int *stream_fds, int nr_stream_fds, + int64_t blocking_timeout); + void (*channel_destroy)(struct lttng_channel *chan); + /* + * packet_avail_size returns the available size in the current + * packet. Note that the size returned is only a hint, since it + * may change due to concurrent writes. + */ + size_t (*packet_avail_size)(struct lttng_ust_lib_ring_buffer_channel *chan, + struct lttng_ust_shm_handle *handle); + int (*is_finalized)(struct lttng_ust_lib_ring_buffer_channel *chan); + int (*is_disabled)(struct lttng_ust_lib_ring_buffer_channel *chan); + int (*flush_buffer)(struct lttng_ust_lib_ring_buffer_channel *chan, + struct lttng_ust_shm_handle *handle); +}; + +static inline +struct lttng_ust_type_integer *lttng_ust_get_type_integer(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_integer) + return NULL; + return caa_container_of(type, struct lttng_ust_type_integer, parent); +} + +static inline +struct lttng_ust_type_float *lttng_ust_get_type_float(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_float) + return NULL; + return caa_container_of(type, struct lttng_ust_type_float, parent); +} + +static inline +struct lttng_ust_type_string *lttng_ust_get_type_string(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_string) + return NULL; + return caa_container_of(type, struct lttng_ust_type_string, parent); +} + +static inline +struct lttng_ust_type_enum *lttng_ust_get_type_enum(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_enum) + return NULL; + return caa_container_of(type, struct lttng_ust_type_enum, parent); +} + +static inline +struct lttng_ust_type_array *lttng_ust_get_type_array(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_array) + return NULL; + return caa_container_of(type, struct lttng_ust_type_array, parent); +} + +static inline +struct lttng_ust_type_sequence *lttng_ust_get_type_sequence(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_sequence) + return NULL; + return caa_container_of(type, struct lttng_ust_type_sequence, parent); +} + +static inline +struct lttng_ust_type_struct *lttng_ust_get_type_struct(struct lttng_ust_type_common *type) +{ + if (type->type != lttng_ust_type_struct) + return NULL; + return caa_container_of(type, struct lttng_ust_type_struct, parent); +} + +/* Create dynamically allocated types. */ +static inline +struct lttng_ust_type_common *lttng_ust_create_type_integer(unsigned int size, + unsigned short alignment, bool signedness, unsigned int byte_order, + unsigned int base) +{ + struct lttng_ust_type_integer *integer_type; + + integer_type = zmalloc(sizeof(struct lttng_ust_type_integer)); + if (!integer_type) + return NULL; + integer_type->parent.type = lttng_ust_type_integer; + integer_type->struct_size = sizeof(struct lttng_ust_type_integer); + integer_type->size = size; + integer_type->alignment = alignment; + integer_type->signedness = signedness; + integer_type->reverse_byte_order = byte_order != BYTE_ORDER; + integer_type->base = base; + return (struct lttng_ust_type_common *) integer_type; +} + +static inline +struct lttng_ust_type_common *lttng_ust_create_type_array_text(unsigned int length) +{ + struct lttng_ust_type_array *array_type; + + array_type = zmalloc(sizeof(struct lttng_ust_type_array)); + if (!array_type) + return NULL; + array_type->parent.type = lttng_ust_type_array; + array_type->struct_size = sizeof(struct lttng_ust_type_array); + array_type->length = length; + array_type->alignment = 0; + array_type->encoding = lttng_ust_string_encoding_UTF8; + array_type->elem_type = lttng_ust_create_type_integer(sizeof(char) * CHAR_BIT, + lttng_alignof(char) * CHAR_BIT, lttng_is_signed_type(char), + BYTE_ORDER, 10); + if (!array_type->elem_type) + goto error_elem; + return (struct lttng_ust_type_common *) array_type; + +error_elem: + free(array_type); + return NULL; +} + +/* + * Destroy dynamically allocated types, including nested types. + * For enumerations, it does not free the enumeration mapping description. + */ +static inline +void lttng_ust_destroy_type(struct lttng_ust_type_common *type) +{ + if (!type) + return; + + switch (type->type) { + case lttng_ust_type_integer: + case lttng_ust_type_string: + case lttng_ust_type_float: + case lttng_ust_type_dynamic: + free(type); + break; + case lttng_ust_type_enum: + { + struct lttng_ust_type_enum *enum_type = (struct lttng_ust_type_enum *) type; + + lttng_ust_destroy_type(enum_type->container_type); + free(enum_type); + break; + } + case lttng_ust_type_array: + { + struct lttng_ust_type_array *array_type = (struct lttng_ust_type_array *) type; + + lttng_ust_destroy_type(array_type->elem_type); + free(array_type); + break; + } + case lttng_ust_type_sequence: + { + struct lttng_ust_type_sequence *sequence_type = (struct lttng_ust_type_sequence *) type; + + lttng_ust_destroy_type(sequence_type->elem_type); + free(sequence_type); + break; + } + case lttng_ust_type_struct: + { + struct lttng_ust_type_struct *struct_type = (struct lttng_ust_type_struct *) type; + unsigned int i; + + for (i = 0; i < struct_type->nr_fields; i++) + lttng_ust_destroy_type(struct_type->fields[i]->type); + free(struct_type); + break; + } + default: + abort(); + } +} + static inline struct lttng_enabler *lttng_event_enabler_as_enabler( struct lttng_event_enabler *event_enabler) @@ -393,8 +580,8 @@ int lttng_event_enabler_attach_exclusion(struct lttng_event_enabler *enabler, * event_notifier enabler) to ensure each is linked to the provided instance. */ __attribute__((visibility("hidden"))) -void lttng_enabler_link_bytecode(const struct lttng_ust_event_desc *event_desc, - struct lttng_ctx **ctx, +void lttng_enabler_link_bytecode(struct lttng_ust_event_desc *event_desc, + struct lttng_ust_ctx **ctx, struct cds_list_head *instance_bytecode_runtime_head, struct cds_list_head *enabler_bytecode_runtime_head); @@ -497,7 +684,7 @@ __attribute__((visibility("hidden"))) int lttng_add_perf_counter_to_ctx(uint32_t type, uint64_t config, const char *name, - struct lttng_ctx **ctx); + struct lttng_ust_ctx **ctx); __attribute__((visibility("hidden"))) int lttng_perf_counter_init(void); @@ -511,7 +698,7 @@ static inline int lttng_add_perf_counter_to_ctx(uint32_t type, uint64_t config, const char *name, - struct lttng_ctx **ctx) + struct lttng_ust_ctx **ctx) { return -ENOSYS; } @@ -547,19 +734,25 @@ struct lttng_ust_abi_field_iter * lttng_ust_field_list_get_iter_next(struct lttng_ust_field_list *list); __attribute__((visibility("hidden"))) -struct lttng_session *lttng_session_create(void); +struct lttng_ust_session *lttng_session_create(void); __attribute__((visibility("hidden"))) -int lttng_session_enable(struct lttng_session *session); +int lttng_session_enable(struct lttng_ust_session *session); __attribute__((visibility("hidden"))) -int lttng_session_disable(struct lttng_session *session); +int lttng_session_disable(struct lttng_ust_session *session); __attribute__((visibility("hidden"))) -int lttng_session_statedump(struct lttng_session *session); +int lttng_session_statedump(struct lttng_ust_session *session); __attribute__((visibility("hidden"))) -void lttng_session_destroy(struct lttng_session *session); +void lttng_session_destroy(struct lttng_ust_session *session); + +/* + * Called with ust lock held. + */ +__attribute__((visibility("hidden"))) +int lttng_session_active(void); __attribute__((visibility("hidden"))) struct cds_list_head *lttng_get_sessions(void); @@ -568,7 +761,7 @@ __attribute__((visibility("hidden"))) void lttng_handle_pending_statedump(void *owner); __attribute__((visibility("hidden"))) -struct lttng_channel *lttng_channel_create(struct lttng_session *session, +struct lttng_channel *lttng_channel_create(struct lttng_ust_session *session, const char *transport_name, void *buf_addr, size_t subbuf_size, size_t num_subbuf, @@ -590,6 +783,12 @@ void lttng_transport_register(struct lttng_transport *transport); __attribute__((visibility("hidden"))) void lttng_transport_unregister(struct lttng_transport *transport); +/* This is ABI between liblttng-ust and liblttng-ust-ctl */ +struct lttng_transport *lttng_ust_transport_find(const char *name); + +/* This is ABI between liblttng-ust and liblttng-ust-dl */ +void lttng_ust_dl_update(void *ip); + __attribute__((visibility("hidden"))) void lttng_probe_provider_unregister_events(struct lttng_ust_probe_desc *desc); @@ -600,8 +799,8 @@ __attribute__((visibility("hidden"))) struct cds_list_head *lttng_get_probe_list_head(void); __attribute__((visibility("hidden"))) -struct lttng_enum *lttng_ust_enum_get_from_desc(struct lttng_session *session, - const struct lttng_ust_enum_desc *enum_desc); +struct lttng_enum *lttng_ust_enum_get_from_desc(struct lttng_ust_session *session, + struct lttng_ust_enum_desc *enum_desc); __attribute__((visibility("hidden"))) int lttng_abi_create_root_handle(void);