From 8793d9f8b7d71898bd3097af5e584517268370d4 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Wed, 27 Nov 2013 11:40:10 -0500 Subject: [PATCH] Handle the inactive streams When content_size == 0, just set the timestamp_end of the packet and reinsert the stream in the heap. This is required to handle the beacons of inactivity generated in LTTng live trace streaming. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- formats/ctf/ctf.c | 5 +++++ lib/iterator.c | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 794e428c..5f263cd3 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -471,6 +471,11 @@ int ctf_read_event(struct bt_stream_pos *ppos, struct ctf_stream_definition *str */ if (unlikely(pos->offset == EOF)) return EOF; + + if (pos->content_size == 0) { + /* Stream is inactive for now (live reading). */ + return EAGAIN; + } assert(pos->offset < pos->content_size); /* Read event header */ diff --git a/lib/iterator.c b/lib/iterator.c index 009fcd3f..155fcbe6 100644 --- a/lib/iterator.c +++ b/lib/iterator.c @@ -65,6 +65,9 @@ static int stream_read_event(struct ctf_file_stream *sin) ret = sin->pos.parent.event_cb(&sin->pos.parent, &sin->parent); if (ret == EOF) return EOF; + else if (ret == EAGAIN) + /* Stream is inactive for now (live reading). */ + return EAGAIN; else if (ret) { fprintf(stderr, "[error] Reading event failed.\n"); return ret; @@ -803,9 +806,17 @@ int bt_iter_next(struct bt_iter *iter) assert(removed == file_stream); ret = 0; goto end; + } else if (ret == EAGAIN) { + /* + * The stream is inactive for now, we just updated the timestamp_end + * to skip over this stream up to a certain point in time. + */ + goto reinsert; } else if (ret) { goto end; } + +reinsert: /* Reinsert the file stream into the heap, and rebalance. */ removed = bt_heap_replace_max(iter->stream_heap, file_stream); assert(removed == file_stream); -- 2.34.1