X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Fiterator.c;h=70f25edd9f0a0948a7820b894fec2bb7143426a3;hp=540d5e9bcf04b6ba46ca99c2a66db9ec7e31ec74;hb=c862350b39e4d95750bbb627497d3768d87817ff;hpb=4fd5ac4b22481d3c7e3f471cdc34ccfdcea4c781 diff --git a/lib/iterator.c b/lib/iterator.c index 540d5e9b..70f25edd 100644 --- a/lib/iterator.c +++ b/lib/iterator.c @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -72,6 +73,7 @@ static int stream_read_event(struct ctf_file_stream *sin) fprintf(stderr, "[error] Reading event failed.\n"); return ret; } + return 0; } @@ -170,6 +172,16 @@ static int seek_ctf_trace_by_timestamp(struct ctf_trace *tin, { int i, j, ret; int found = 0; + struct bt_trace_descriptor *td = &tin->parent; + + if (td->interval_set) { + /* + * If this trace has an interval selected, don't allow seeks + * before the selected interval. We seek to the start of the + * interval, thereby presenting a shorter "virtual" trace. + */ + timestamp = max(timestamp, td->interval_real.timestamp_begin); + } /* for each stream_class */ for (i = 0; i < tin->streams->len; i++) { @@ -615,14 +627,11 @@ error: return NULL; } -struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter, +struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *unused, uint64_t timestamp) { struct bt_iter_pos *pos; - if (!iter) - return NULL; - pos = g_new0(struct bt_iter_pos, 1); pos->type = BT_SEEK_TIME; pos->u.seek_time = timestamp; @@ -751,6 +760,9 @@ int bt_iter_init(struct bt_iter *iter, ctx->current_iterator = iter; if (begin_pos && begin_pos->type != BT_SEEK_BEGIN) { ret = bt_iter_set_pos(iter, begin_pos); + if (ret) { + goto error; + } } return ret; @@ -805,6 +817,7 @@ int bt_iter_next(struct bt_iter *iter) { struct ctf_file_stream *file_stream, *removed; int ret; + bool event_outside_interval = false; if (!iter) return -EINVAL; @@ -817,7 +830,12 @@ int bt_iter_next(struct bt_iter *iter) } ret = stream_read_event(file_stream); - if (ret == EOF) { + if (file_stream->pos.parent.trace->interval_set) { + event_outside_interval = + file_stream->parent.real_timestamp > + file_stream->pos.parent.trace->interval_real.timestamp_end; + } + if (ret == EOF || event_outside_interval) { removed = bt_heap_remove(iter->stream_heap); assert(removed == file_stream); ret = 0;