X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf-ir%2Fstream-internal.h;h=a54cd57b49924b9c77eb54b3b0ff1df7d0652139;hb=3230ee6b4f3a704958b761daecae835c56938bc9;hp=7461d321f0fe34c85c67a9898dd04fd29a25da8a;hpb=5fd2e9fda6185e989583e6e61b9312683149747e;p=babeltrace.git diff --git a/include/babeltrace/ctf-ir/stream-internal.h b/include/babeltrace/ctf-ir/stream-internal.h index 7461d321..a54cd57b 100644 --- a/include/babeltrace/ctf-ir/stream-internal.h +++ b/include/babeltrace/ctf-ir/stream-internal.h @@ -32,31 +32,78 @@ #include #include #include +#include #include -#include #include +struct bt_port; +struct bt_component; + +typedef void (*bt_ctf_stream_destroy_listener_func)( + struct bt_ctf_stream *stream, void *data); + +struct bt_ctf_stream_destroy_listener { + bt_ctf_stream_destroy_listener_func func; + void *data; +}; + struct bt_ctf_stream { struct bt_object base; uint32_t id; struct bt_ctf_stream_class *stream_class; + GString *name; + struct bt_ctf_field *packet_header; + struct bt_ctf_field *packet_context; + + /* + * When a notification which contains a reference to a stream + * object (event notification, for example) is returned by the + * "next" method of a sink or filter component's notification + * iterator, it must NOT be returned by the "next" method of a + * notification iterator which iterates on the notifications of + * another output port of the same component. + * + * To ensure this, the stream object keeps a hash table which + * indicates which port, for a given component, is currently + * allowed to emit notifications which contain a reference to + * this stream. + * + * This is a `struct bt_component *` to `struct bt_port *` hash + * table. Both pointers are weak references because there's no + * need to keep one or the other alive as far as this stream is + * concerned. + */ + GHashTable *comp_cur_port; + + /* Writer-specific members. */ /* Array of pointers to bt_ctf_event for the current packet */ GPtrArray *events; - struct ctf_stream_pos pos; + struct bt_ctf_stream_pos pos; unsigned int flushed_packet_count; - struct bt_ctf_field *packet_header; - struct bt_ctf_field *packet_context; - struct bt_ctf_field *event_header; - struct bt_ctf_field *event_context; + uint64_t size; + + /* Array of struct bt_ctf_stream_destroy_listener */ + GArray *destroy_listeners; }; -/* Stream class should be frozen by the caller after creating a stream */ BT_HIDDEN -struct bt_ctf_stream *bt_ctf_stream_create( - struct bt_ctf_stream_class *stream_class, - struct bt_ctf_trace *trace); +int bt_ctf_stream_set_fd(struct bt_ctf_stream *stream, int fd); BT_HIDDEN -int bt_ctf_stream_set_fd(struct bt_ctf_stream *stream, int fd); +void bt_ctf_stream_map_component_to_port(struct bt_ctf_stream *stream, + struct bt_component *comp, + struct bt_port *port); + +BT_HIDDEN +struct bt_port *bt_ctf_stream_port_for_component(struct bt_ctf_stream *stream, + struct bt_component *comp); + +BT_HIDDEN +void bt_ctf_stream_add_destroy_listener(struct bt_ctf_stream *stream, + bt_ctf_stream_destroy_listener_func func, void *data); + +BT_HIDDEN +void bt_ctf_stream_remove_destroy_listener(struct bt_ctf_stream *stream, + bt_ctf_stream_destroy_listener_func func, void *data); #endif /* BABELTRACE_CTF_WRITER_STREAM_INTERNAL_H */