return iter;
}
+struct bt_ctf_iter *bt_ctf_iter_create_intersect(struct bt_context *ctx,
+ struct bt_iter_pos **inter_begin_pos,
+ struct bt_iter_pos **inter_end_pos)
+{
+ uint64_t begin = 0, end = ULLONG_MAX;
+ int ret;
+
+ ret = ctf_find_packets_intersection(ctx, &begin, &end);
+ if (ret == 1) {
+ fprintf(stderr, "[error] No intersection found between trace files.\n");
+ goto error;
+ } else if (ret != 0) {
+ goto error;
+ }
+ *inter_begin_pos = bt_iter_create_time_pos(NULL, begin);
+ if (!(*inter_begin_pos)) {
+ goto error;
+ }
+ *inter_end_pos = bt_iter_create_time_pos(NULL, end);
+ if (!(*inter_end_pos)) {
+ goto error;
+ }
+
+ /*
+ * bt_ctf_iter does not take ownership of begin and end positions,
+ * so we return them to the caller who must still assume their ownership
+ * until the iterator is destroyed.
+ */
+ return bt_ctf_iter_create(ctx, *inter_begin_pos,
+ *inter_end_pos);
+error:
+ return NULL;
+}
+
+
void bt_ctf_iter_destroy(struct bt_ctf_iter *iter)
{
struct bt_stream_callbacks *bt_stream_cb;
*/
assert(iter);
+ if (flags)
+ *flags = 0;
+
ret = &iter->current_ctf_event;
- file_stream = heap_maximum(iter->parent.stream_heap);
+ file_stream = bt_heap_maximum(iter->parent.stream_heap);
if (!file_stream) {
/* end of file for all streams */
goto stop;
}
+
+ /*
+ * If the packet is empty (contains only headers or is of size 0), the
+ * caller has to know that we can't read the current event and we need
+ * to do a bt_iter_next.
+ */
+ if (file_stream->pos.data_offset == file_stream->pos.content_size
+ || file_stream->pos.content_size == 0) {
+ /* More events may come. */
+ ret = NULL;
+ if (flags)
+ *flags |= BT_ITER_FLAG_RETRY;
+ goto end;
+ }
+
stream = &file_stream->parent;
+ if (iter->parent.end_pos &&
+ iter->parent.end_pos->type == BT_SEEK_TIME &&
+ stream->real_timestamp > iter->parent.end_pos->u.seek_time) {
+ goto stop;
+ }
ret->parent = g_ptr_array_index(stream->events_by_id,
stream->event_id);
- if (flags)
- *flags = 0;
- if (!file_stream->pos.packet_cycles_index)
+ if (!file_stream->pos.packet_index)
packet_index = NULL;
else
- packet_index = &g_array_index(file_stream->pos.packet_cycles_index,
+ packet_index = &g_array_index(file_stream->pos.packet_index,
struct packet_index, file_stream->pos.cur_index);
iter->events_lost = 0;
if (packet_index && packet_index->events_discarded >