X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf-ir%2Fstream-internal.h;h=a54cd57b49924b9c77eb54b3b0ff1df7d0652139;hb=3230ee6b4f3a704958b761daecae835c56938bc9;hp=0e0e2498b4d43bf40c0303074a16cb845885b060;hpb=0686ef9496b70a2b1e401375ca6ffd529c4b2a34;p=babeltrace.git diff --git a/include/babeltrace/ctf-ir/stream-internal.h b/include/babeltrace/ctf-ir/stream-internal.h index 0e0e2498..a54cd57b 100644 --- a/include/babeltrace/ctf-ir/stream-internal.h +++ b/include/babeltrace/ctf-ir/stream-internal.h @@ -32,10 +32,21 @@ #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; @@ -44,15 +55,55 @@ struct bt_ctf_stream { 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; uint64_t size; + + /* Array of struct bt_ctf_stream_destroy_listener */ + GArray *destroy_listeners; }; BT_HIDDEN int bt_ctf_stream_set_fd(struct bt_ctf_stream *stream, int fd); +BT_HIDDEN +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 */