X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=include%2Fbabeltrace%2Fctf-ir%2Fevent-internal.h;h=dccc5726f3a84e52d49dfd0e51bb3f0522654ad5;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hp=b15af1107ead8b12aadfb575e053bcd7863d73c3;hpb=50842bdc4c21f3de2b63e29cdac730af8b6dcca6;p=babeltrace.git diff --git a/include/babeltrace/ctf-ir/event-internal.h b/include/babeltrace/ctf-ir/event-internal.h index b15af110..dccc5726 100644 --- a/include/babeltrace/ctf-ir/event-internal.h +++ b/include/babeltrace/ctf-ir/event-internal.h @@ -27,56 +27,236 @@ * SOFTWARE. */ -#include -#include +#include #include #include #include #include #include +#include +#include +#include +#include +#include #include -#include +#include #include struct bt_stream_pos; -struct bt_event { +struct bt_event_common { struct bt_object base; - struct bt_event_class *event_class; - struct bt_packet *packet; - struct bt_field *event_header; - struct bt_field *stream_event_context; - struct bt_field *context_payload; - struct bt_field *fields_payload; + struct bt_event_class_common *class; + struct bt_field_wrapper *header_field; + struct bt_field_common *stream_event_context_field; + struct bt_field_common *context_field; + struct bt_field_common *payload_field; + int frozen; +}; + +struct bt_event { + struct bt_event_common common; + /* Maps clock classes to bt_clock_value. */ GHashTable *clock_values; - int frozen; + struct bt_packet *packet; }; BT_HIDDEN -int bt_event_validate(struct bt_event *event); +int _bt_event_common_validate(struct bt_event_common *event); BT_HIDDEN -int bt_event_serialize(struct bt_event *event, - struct bt_stream_pos *pos, - enum bt_byte_order native_byte_order); +void _bt_event_common_freeze(struct bt_event_common *event); BT_HIDDEN -void bt_event_freeze(struct bt_event *event); +void _bt_event_freeze(struct bt_event *event); + +#ifdef BT_DEV_MODE +# define bt_event_common_validate _bt_event_common_validate +# define bt_event_common_freeze _bt_event_common_freeze +# define bt_event_freeze _bt_event_freeze +#else +# define bt_event_common_validate(_event) 0 +# define bt_event_common_freeze(_event) +# define bt_event_freeze(_event) +#endif + +#define BT_ASSERT_PRE_EVENT_COMMON_HOT(_event, _name) \ + BT_ASSERT_PRE_HOT((_event), (_name), ": +%!+_e", (_event)) + +static inline +struct bt_event_class_common *bt_event_common_borrow_class( + struct bt_event_common *event) +{ + BT_ASSERT(event); + return event->class; +} + +BT_HIDDEN +int bt_event_common_initialize(struct bt_event_common *event, + struct bt_event_class_common *event_class, + struct bt_clock_class *init_expected_clock_class, + bt_object_release_func release_func, + bt_validation_flag_copy_field_type_func field_type_copy_func, + bool must_be_in_trace, + int (*map_clock_classes_func)(struct bt_stream_class_common *stream_class, + struct bt_field_type_common *packet_context_field_type, + struct bt_field_type_common *event_header_field_type), + void *(*create_field_func)(void *), + void (*release_field_func)(void *), + void *(*create_header_field_func)(void *, void *), + void (*release_header_field_func)(void *)); + +static inline +struct bt_field_common *bt_event_common_borrow_payload( + struct bt_event_common *event) +{ + struct bt_field_common *payload = NULL; + + BT_ASSERT_PRE_NON_NULL(event, "Event"); + + if (!event->payload_field) { + BT_LOGV("Event has no current payload field: addr=%p, " + "event-class-name=\"%s\", event-class-id=%" PRId64, + event, bt_event_class_common_get_name(event->class), + bt_event_class_common_get_id(event->class)); + goto end; + } + + payload = event->payload_field; + +end: + return payload; +} + +static inline +struct bt_field_common *bt_event_common_borrow_header( + struct bt_event_common *event) +{ + struct bt_field_common *header = NULL; + + BT_ASSERT_PRE_NON_NULL(event, "Event"); + + if (!event->header_field) { + BT_LOGV("Event has no current header field: addr=%p, " + "event-class-name=\"%s\", event-class-id=%" PRId64, + event, bt_event_class_common_get_name(event->class), + bt_event_class_common_get_id(event->class)); + goto end; + } + + header = event->header_field->field; -static inline struct bt_packet *bt_event_borrow_packet( - struct bt_event *event) +end: + return header; +} + +static inline +struct bt_field_common *bt_event_common_borrow_context( + struct bt_event_common *event) { - assert(event); - return event->packet; + struct bt_field_common *context = NULL; + + BT_ASSERT_PRE_NON_NULL(event, "Event"); + + if (!event->context_field) { + BT_LOGV("Event has no current context field: addr=%p, " + "event-class-name=\"%s\", event-class-id=%" PRId64, + event, bt_event_class_common_get_name(event->class), + bt_event_class_common_get_id(event->class)); + goto end; + } + + context = event->context_field; + +end: + return context; } static inline -struct bt_event_class *bt_event_borrow_event_class( - struct bt_event *event) +struct bt_field_common *bt_event_common_borrow_stream_event_context( + struct bt_event_common *event) { - assert(event); - return event->event_class; + struct bt_field_common *stream_event_context = NULL; + + BT_ASSERT_PRE_NON_NULL(event, "Event"); + + if (!event->stream_event_context_field) { + BT_LOGV("Event has no current stream event context field: addr=%p, " + "event-class-name=\"%s\", event-class-id=%" PRId64, + event, bt_event_class_common_get_name(event->class), + bt_event_class_common_get_id(event->class)); + goto end; + } + + stream_event_context = event->stream_event_context_field; + +end: + return stream_event_context; } +static inline +void bt_event_common_finalize(struct bt_object *obj, + void (*field_release_func)(void *), + void (*header_field_release_func)(void *, struct bt_event_common *)) +{ + struct bt_event_common *event = (void *) obj; + + BT_LOGD("Destroying event: addr=%p, " + "event-class-name=\"%s\", event-class-id=%" PRId64, + event, + event->class ? bt_event_class_common_get_name(event->class) : NULL, + event->class ? bt_event_class_common_get_id(event->class) : INT64_C(-1)); + + if (event->header_field) { + BT_LOGD_STR("Releasing event's header field."); + header_field_release_func(event->header_field, event); + } + + if (event->stream_event_context_field) { + BT_LOGD_STR("Releasing event's stream event context field."); + field_release_func(event->stream_event_context_field); + } + + if (event->context_field) { + BT_LOGD_STR("Releasing event's context field."); + field_release_func(event->context_field); + } + + if (event->payload_field) { + BT_LOGD_STR("Releasing event's payload field."); + field_release_func(event->payload_field); + } + + /* + * Leave this after calling header_field_release_func() because + * this function receives the event object and could need its + * class to perform some cleanup. + */ + if (!event->base.parent) { + /* + * Event was keeping a reference to its class since it shared no + * common ancestor with it to guarantee they would both have the + * same lifetime. + */ + bt_put(event->class); + } +} + +BT_HIDDEN +struct bt_event *bt_event_new(struct bt_event_class *event_class); + +BT_HIDDEN +struct bt_event *bt_event_create(struct bt_event_class *event_class, + struct bt_packet *packet); + +BT_HIDDEN +void bt_event_recycle(struct bt_event *event); + +BT_HIDDEN +void bt_event_destroy(struct bt_event *event); + +BT_HIDDEN +int bt_event_set_packet(struct bt_event *event, struct bt_packet *packet); + #endif /* BABELTRACE_CTF_IR_EVENT_INTERNAL_H */