X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf-ir%2Fstream-class-internal.h;h=6a167c9371267cf2302844cf46ca6de1f5b7ad3a;hb=cb6f1f7dfb7938a4738a7f3ca3886334fbceb1a3;hp=88d38c2100b97db509f1ebbfd2631f3f597afc17;hpb=e6a8e8e4744633807083a077ff9f101eb97d9801;p=babeltrace.git diff --git a/include/babeltrace/ctf-ir/stream-class-internal.h b/include/babeltrace/ctf-ir/stream-class-internal.h index 88d38c21..6a167c93 100644 --- a/include/babeltrace/ctf-ir/stream-class-internal.h +++ b/include/babeltrace/ctf-ir/stream-class-internal.h @@ -27,49 +27,102 @@ * SOFTWARE. */ -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include -#include #include +#include -struct bt_ctf_stream_class { +struct bt_stream_class { struct bt_object base; GString *name; - struct bt_ctf_clock *clock; - GPtrArray *event_classes; /* Array of pointers to bt_ctf_event_class */ + + /* Array of pointers to event class addresses */ + GPtrArray *event_classes; + + /* event class id (int64_t) to event class address */ + GHashTable *event_classes_ht; int id_set; - uint32_t id; - uint32_t next_event_id; - uint32_t next_stream_id; - struct bt_ctf_field_type *packet_context_type; - struct bt_ctf_field_type *event_header_type; - struct bt_ctf_field_type *event_context_type; + int64_t id; + int64_t next_event_id; + struct bt_field_type *packet_context_field_type; + struct bt_field_type *event_header_field_type; + struct bt_field_type *event_context_field_type; int frozen; int byte_order; + + /* + * This flag indicates if the stream class is valid. A valid + * stream class is _always_ frozen. + */ + int valid; + + /* + * Unique clock class mapped to any field type within this + * stream class, including all the stream class's event class + * field types. This is only set if the stream class is frozen. + * + * If the stream class is frozen and this is still NULL, it is + * still possible that it becomes non-NULL because + * bt_stream_class_add_event_class() can add an event class + * containing a field type mapped to some clock class. In this + * case, this is the mapped clock class, and at this point, both + * the new event class and the stream class are frozen, so the + * next added event classes are expected to contain field types + * which only map to this specific clock class. + * + * If this is a CTF writer stream class, then this is the + * backing clock class of the `clock` member above. + */ + struct bt_clock_class *clock_class; + + /* Pool of `struct bt_field_wrapper *` */ + struct bt_object_pool event_header_field_pool; + + /* Pool of `struct bt_field_wrapper *` */ + struct bt_object_pool packet_context_field_pool; }; -BT_HIDDEN -void bt_ctf_stream_class_freeze(struct bt_ctf_stream_class *stream_class); +struct bt_event_class; BT_HIDDEN -int bt_ctf_stream_class_serialize(struct bt_ctf_stream_class *stream_class, - struct metadata_context *context); +void bt_stream_class_freeze(struct bt_stream_class *stream_class); BT_HIDDEN -int bt_ctf_stream_class_set_byte_order(struct bt_ctf_stream_class *stream_class, - enum bt_ctf_byte_order byte_order); +int bt_stream_class_validate_single_clock_class( + struct bt_stream_class *stream_class, + struct bt_clock_class **expected_clock_class); -/* Set stream_class id without checking if the stream class is frozen */ BT_HIDDEN -int _bt_ctf_stream_class_set_id(struct bt_ctf_stream_class *stream_class, - uint32_t id); +int bt_stream_class_visit(struct bt_stream_class *stream_class, + bt_visitor visitor, void *data); -BT_HIDDEN -int bt_ctf_stream_class_set_id_no_check( - struct bt_ctf_stream_class *stream_class, uint32_t id); +static inline +void _bt_stream_class_set_id( + struct bt_stream_class *stream_class, int64_t id) +{ + BT_ASSERT(stream_class); + stream_class->id = id; + stream_class->id_set = 1; + BT_LOGV("Set stream class's ID (internal): " + "addr=%p, name=\"%s\", id=%" PRId64, + stream_class, bt_stream_class_get_name(stream_class), + bt_stream_class_get_id(stream_class)); +} + +static inline +int bt_stream_class_set_id_no_check( + struct bt_stream_class *stream_class, int64_t id) +{ + _bt_stream_class_set_id(stream_class, id); + return 0; +} #endif /* BABELTRACE_CTF_IR_STREAM_CLASS_INTERNAL_H */