#include <stdlib.h>
#include <babeltrace/babeltrace.h>
+#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/context.h>
#include <babeltrace/context-internal.h>
#include <babeltrace/iterator-internal.h>
fprintf(stderr, "[error] Reading event failed.\n");
return ret;
}
+
return 0;
}
{
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++) {
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;
int i;
int ret = 0;
- if (!iter || !ctx)
+ if (!iter || !ctx || !ctx->tc || !ctx->tc->array)
return -EINVAL;
if (ctx->current_iterator) {
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;
{
struct ctf_file_stream *file_stream, *removed;
int ret;
+ bool event_outside_interval = false;
if (!iter)
return -EINVAL;
}
ret = stream_read_event(file_stream);
- if (ret == EOF) {
+ if (file_stream->pos.parent.trace &&
+ 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;