X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf-ir%2Fevent-internal.h;h=dccc5726f3a84e52d49dfd0e51bb3f0522654ad5;hp=cc10f224015034a9bb9484b91f3b82dba6814608;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hpb=41ac640a35c8f7ec7ffdb1d069180315533e7353 diff --git a/include/babeltrace/ctf-ir/event-internal.h b/include/babeltrace/ctf-ir/event-internal.h index cc10f224..dccc5726 100644 --- a/include/babeltrace/ctf-ir/event-internal.h +++ b/include/babeltrace/ctf-ir/event-internal.h @@ -27,52 +27,236 @@ * SOFTWARE. */ -#include -#include +#include #include #include -#include #include #include #include +#include +#include +#include +#include +#include #include +#include #include -struct bt_ctf_event { +struct bt_stream_pos; + +struct bt_event_common { struct bt_object base; - struct bt_ctf_event_class *event_class; - struct bt_ctf_packet *packet; - struct bt_ctf_field *event_header; - struct bt_ctf_field *stream_event_context; - struct bt_ctf_field *context_payload; - struct bt_ctf_field *fields_payload; - GHashTable *clock_values; /* Maps clock addresses to (uint64_t *) */ + 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; + struct bt_packet *packet; +}; + BT_HIDDEN -int bt_ctf_event_register_stream_clock_values(struct bt_ctf_event *event); +int _bt_event_common_validate(struct bt_event_common *event); BT_HIDDEN -int bt_ctf_event_validate(struct bt_ctf_event *event); +void _bt_event_common_freeze(struct bt_event_common *event); BT_HIDDEN -int bt_ctf_event_serialize(struct bt_ctf_event *event, - struct ctf_stream_pos *pos); +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; + +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 +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); -/* - * 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); +void bt_event_destroy(struct bt_event *event); BT_HIDDEN -void bt_ctf_event_freeze(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 */