Handle empty streams on iterator init
[babeltrace.git] / lib / iterator.c
index 009fcd3fecf0b502e19a4719225d470fd4719c7d..3280f4a816c3a88468dfb99dd320111c24ded54d 100644 (file)
@@ -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;
 }
This page took 0.023735 seconds and 4 git commands to generate.