#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;
}
continue;
stream_pos->packet_seek(&stream_pos->parent, i, SEEK_SET);
+ ret = bt_packet_seek_get_error();
+ if (ret < 0) {
+ return EOF;
+ }
do {
ret = stream_read_event(cfs);
} while (cfs->parent.real_timestamp < timestamp && ret == 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++) {
*/
for (i = stream_pos->packet_index->len - 1; i >= 0; i--) {
stream_pos->packet_seek(&stream_pos->parent, i, SEEK_SET);
+ ret = bt_packet_seek_get_error();
+ if (ret < 0) {
+ return EOF;
+ }
count = 0;
/* read each event until we reach the end of the stream */
do {
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;
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;
error:
bt_heap_free(iter->stream_heap);
error_heap_init:
+ bt_context_put(ctx);
+ iter->ctx = NULL;
g_free(iter->stream_heap);
iter->stream_heap = NULL;
error_ctx:
}
iter->ctx->current_iterator = NULL;
bt_context_put(iter->ctx);
+ iter->ctx = NULL;
}
void bt_iter_destroy(struct bt_iter *iter)
{
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;
*/
ret = 0;
goto reinsert;
+ } else if (ret == -ERANGE) {
+ removed = bt_heap_remove(iter->stream_heap);
+ assert(removed == file_stream);
+ goto end;
} else if (ret) {
goto end;
}