X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fiterator.c;h=3280f4a816c3a88468dfb99dd320111c24ded54d;hb=b5f5f9e1854297ddff94aa9e210dbf865e0edcfa;hp=009fcd3fecf0b502e19a4719225d470fd4719c7d;hpb=6c9a50c0105929edd0ddef958378e8714b854c46;p=babeltrace.git diff --git a/lib/iterator.c b/lib/iterator.c index 009fcd3f..3280f4a8 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; @@ -722,7 +725,7 @@ int bt_iter_init(struct bt_iter *iter, if (ret == EOF) { ret = 0; continue; - } else if (ret) { + } else if (ret != 0 && ret != EAGAIN) { goto error; } /* Add to heap */ @@ -803,13 +806,28 @@ 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); + file_stream = bt_heap_maximum(iter->stream_heap); + if (file_stream->pos.content_size == 0) { + ret = EAGAIN; + } else { + ret = 0; + } + end: return ret; }