Live: let read API detect inactive streams, allow streams without fd
[babeltrace.git] / lib / iterator.c
index 3280f4a816c3a88468dfb99dd320111c24ded54d..853898d33e995e7004c177bff0d5782272c9898c 100644 (file)
@@ -705,23 +705,17 @@ int bt_iter_init(struct bt_iter *iter,
                        for (filenr = 0; filenr < stream->streams->len;
                                        filenr++) {
                                struct ctf_file_stream *file_stream;
+                               struct bt_iter_pos pos;
 
                                file_stream = g_ptr_array_index(stream->streams,
                                                filenr);
                                if (!file_stream)
                                        continue;
-                               if (begin_pos) {
-                                       ret = babeltrace_filestream_seek(
-                                                       file_stream,
-                                                       begin_pos,
-                                                       stream_id);
-                               } else {
-                                       struct bt_iter_pos pos;
-                                       pos.type = BT_SEEK_BEGIN;
-                                       ret = babeltrace_filestream_seek(
-                                                       file_stream, &pos,
-                                                       stream_id);
-                               }
+
+                               pos.type = BT_SEEK_BEGIN;
+                               ret = babeltrace_filestream_seek(file_stream,
+                                       &pos, stream_id);
+
                                if (ret == EOF) {
                                        ret = 0;
                                        continue;
@@ -737,7 +731,11 @@ int bt_iter_init(struct bt_iter *iter,
        }
 
        ctx->current_iterator = iter;
-       return 0;
+       if (begin_pos && begin_pos->type != BT_SEEK_BEGIN) {
+               ret = bt_iter_set_pos(iter, begin_pos);
+       }
+
+       return ret;
 
 error:
        bt_heap_free(iter->stream_heap);
@@ -808,9 +806,18 @@ int bt_iter_next(struct bt_iter *iter)
                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.
+                * Live streaming: the stream is inactive for now, we
+                * just updated the timestamp_end to skip over this
+                * stream up to a certain point in time.
+                *
+                * Since we can't guarantee that a stream will ever have
+                * any activity, we can't rely on the fact that
+                * bt_iter_next will be called for each stream and deal
+                * with inactive streams. So instead, we return 0 here
+                * to the caller and let the read API handle the
+                * retry case.
                 */
+               ret = 0;
                goto reinsert;
        } else if (ret) {
                goto end;
@@ -822,11 +829,6 @@ reinsert:
        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.023907 seconds and 4 git commands to generate.