X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf-ir%2Fevent-internal.h;h=dccc5726f3a84e52d49dfd0e51bb3f0522654ad5;hp=43a12ba52d64fd22782ec2b1e9ca456d0f567884;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hpb=09840de5d022697671dafe2bed427fa5c09b40b9 diff --git a/include/babeltrace/ctf-ir/event-internal.h b/include/babeltrace/ctf-ir/event-internal.h index 43a12ba5..dccc5726 100644 --- a/include/babeltrace/ctf-ir/event-internal.h +++ b/include/babeltrace/ctf-ir/event-internal.h @@ -2,7 +2,7 @@ #define BABELTRACE_CTF_IR_EVENT_INTERNAL_H /* - * BabelTrace - CTF IR: Event internal + * Babeltrace - CTF IR: Event internal * * Copyright 2013, 2014 Jérémie Galarneau * @@ -27,78 +27,236 @@ * SOFTWARE. */ -#include -#include +#include #include #include -#include #include #include +#include +#include +#include +#include +#include +#include #include +#include #include -#define BT_CTF_EVENT_CLASS_ATTR_ID_INDEX 0 -#define BT_CTF_EVENT_CLASS_ATTR_NAME_INDEX 1 +struct bt_stream_pos; -struct bt_ctf_event_class { +struct bt_event_common { struct bt_object base; - struct bt_value *attributes; - /* Structure type containing the event's context */ - struct bt_ctf_field_type *context; - /* Structure type containing the event's fields */ - struct bt_ctf_field_type *fields; + 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; - - /* - * This flag indicates if the event class is valid. A valid - * event class is _always_ frozen. However, an event class - * may be frozen, but not valid yet. This is okay, as long as - * no events are created out of this event class. - */ - int valid; }; -struct bt_ctf_event { - struct bt_object base; - struct bt_ctf_event_class *event_class; - struct bt_ctf_field *event_header; - struct bt_ctf_field *context_payload; - struct bt_ctf_field *fields_payload; +struct bt_event { + struct bt_event_common common; + + /* Maps clock classes to bt_clock_value. */ + GHashTable *clock_values; + struct bt_packet *packet; }; BT_HIDDEN -void bt_ctf_event_class_freeze(struct bt_ctf_event_class *event_class); +int _bt_event_common_validate(struct bt_event_common *event); + +BT_HIDDEN +void _bt_event_common_freeze(struct bt_event_common *event); + +BT_HIDDEN +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_ctf_event_class_serialize(struct bt_ctf_event_class *event_class, - struct metadata_context *context); +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; + +end: + return header; +} + +static inline +struct bt_field_common *bt_event_common_borrow_context( + struct bt_event_common *event) +{ + 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_field_common *bt_event_common_borrow_stream_event_context( + struct bt_event_common *event) +{ + 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 -void bt_ctf_event_class_set_native_byte_order( - struct bt_ctf_event_class *event_class, - int byte_order); +struct bt_event *bt_event_new(struct bt_event_class *event_class); BT_HIDDEN -int bt_ctf_event_class_set_stream_id(struct bt_ctf_event_class *event_class, - uint32_t stream_id); +struct bt_event *bt_event_create(struct bt_event_class *event_class, + struct bt_packet *packet); BT_HIDDEN -int bt_ctf_event_validate(struct bt_ctf_event *event); +void bt_event_recycle(struct bt_event *event); BT_HIDDEN -int bt_ctf_event_serialize(struct bt_ctf_event *event, - struct ctf_stream_pos *pos); +void bt_event_destroy(struct bt_event *event); -/* - * Attempt to populate the "id" and "timestamp" fields of the event header if - * they are present, unset and their types are integers. - * - * Not finding these fields or encountering unexpected types is not an error - * since the user may have defined a different event header layout. In this - * case, it is expected that the fields be manually populated before appending - * an event to a stream. - */ BT_HIDDEN -int bt_ctf_event_populate_event_header(struct bt_ctf_event *event); +int bt_event_set_packet(struct bt_event *event, struct bt_packet *packet); #endif /* BABELTRACE_CTF_IR_EVENT_INTERNAL_H */