From cacf314785b049b29ac1196c28086c99df396280 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Tue, 23 Feb 2016 19:43:47 -0500 Subject: [PATCH] Fix: do not set event's parent to a non-writer stream MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Since a non-writer stream does not know the events that are associated to it, an event with a non-writer stream parent can never be destroyed. Fix this by setting a stream parent if the stream is a writer stream, and otherwise by using the event's packet's stream. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- formats/ctf/ir/event.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/formats/ctf/ir/event.c b/formats/ctf/ir/event.c index 0b49abbe..3ea59eaa 100644 --- a/formats/ctf/ir/event.c +++ b/formats/ctf/ir/event.c @@ -259,7 +259,27 @@ end: struct bt_ctf_stream *bt_ctf_event_get_stream(struct bt_ctf_event *event) { - return (struct bt_ctf_stream *) bt_object_get_parent(event); + struct bt_ctf_stream *stream = NULL; + + if (!event) { + goto end; + } + + /* + * If the event has a parent, then this is its (writer) stream. + * If the event has no parent, then if it has a packet, this + * is its (non-writer) stream. + */ + if (event->base.parent) { + stream = (struct bt_ctf_stream *) bt_object_get_parent(event); + } else { + if (event->packet) { + stream = bt_get(event->packet->stream); + } + } + +end: + return stream; } struct bt_ctf_clock *bt_ctf_event_get_clock(struct bt_ctf_event *event) @@ -766,14 +786,6 @@ int bt_ctf_event_set_packet(struct bt_ctf_event *event, goto end; } } else { - /* - * This event is an orphan for the moment: it's not - * associated to a stream. If this event's event - * class's stream class is the same as the packet's - * stream's stream class, then it's okay to make the - * packet's stream the parent of this event. Otherwise - * it's an error. - */ event_stream_class = bt_ctf_event_class_get_stream_class(event->event_class); packet_stream_class = @@ -786,12 +798,10 @@ int bt_ctf_event_set_packet(struct bt_ctf_event *event, ret = -1; goto end; } - - bt_object_set_parent(event, packet->stream); } - bt_put(event->packet); - event->packet = bt_get(packet); + bt_get(packet); + BT_MOVE(event->packet, packet); end: BT_PUT(stream); -- 2.34.1