Merge real index and cycles index into a single index
[babeltrace.git] / lib / iterator.c
index 966a00010e3e82a8393987f72f78b9e4d820c70f..fd58dec99ce45dc4e8a682220d20ebf3a6edb3dc 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;
@@ -132,10 +135,10 @@ static int seek_file_stream_by_timestamp(struct ctf_file_stream *cfs,
        int i, ret;
 
        stream_pos = &cfs->pos;
-       for (i = 0; i < stream_pos->packet_real_index->len; i++) {
-               index = &g_array_index(stream_pos->packet_real_index,
+       for (i = 0; i < stream_pos->packet_index->len; i++) {
+               index = &g_array_index(stream_pos->packet_index,
                                struct packet_index, i);
-               if (index->timestamp_end < timestamp)
+               if (index->ts_real.timestamp_end < timestamp)
                        continue;
 
                stream_pos->packet_seek(&stream_pos->parent, i, SEEK_SET);
@@ -226,7 +229,7 @@ static int find_max_timestamp_ctf_file_stream(struct ctf_file_stream *cfs,
         * either find at least one event, or we reach the first packet
         * (some packets can be empty).
         */
-       for (i = stream_pos->packet_real_index->len - 1; i >= 0; i--) {
+       for (i = stream_pos->packet_index->len - 1; i >= 0; i--) {
                stream_pos->packet_seek(&stream_pos->parent, i, SEEK_SET);
                count = 0;
                /* read each event until we reach the end of the stream */
@@ -716,7 +719,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 */
@@ -801,13 +804,29 @@ int bt_iter_next(struct bt_iter *iter)
                assert(removed == file_stream);
                ret = 0;
                goto end;
+       } else if (ret == EAGAIN) {
+               /*
+                * 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;
        }
+
+reinsert:
        /* Reinsert the file stream into the heap, and rebalance. */
        removed = bt_heap_replace_max(iter->stream_heap, file_stream);
        assert(removed == file_stream);
-
 end:
        return ret;
 }
This page took 0.025819 seconds and 4 git commands to generate.