int _bt_python_ctf_clock_set_uuid_index(struct bt_ctf_clock *clock,
size_t index, unsigned char value);
struct bt_iter_pos *_bt_python_create_iter_pos(void);
+struct bt_ctf_iter *_bt_python_ctf_iter_create_intersect(
+ struct bt_context *ctx,
+ struct bt_iter_pos *inter_begin_pos,
+ struct bt_iter_pos *inter_end_pos);
+int _bt_python_has_intersection(struct bt_context *ctx);
/* context.h, context-internal.h */
%rename("_bt_context_create") bt_context_create(void);
#include <babeltrace/ctf-ir/event-class.h>
#include <babeltrace/ctf-ir/clock-internal.h>
#include <babeltrace/iterator.h>
+#include <babeltrace/ctf/iterator.h>
+#include <babeltrace/ctf/events-internal.h>
#include <glib.h>
/* List-related functions
{
return g_new0(struct bt_iter_pos, 1);
}
+
+struct bt_ctf_iter *_bt_python_ctf_iter_create_intersect(
+ struct bt_context *ctx,
+ struct bt_iter_pos *inter_begin_pos,
+ struct bt_iter_pos *inter_end_pos)
+{
+ return bt_ctf_iter_create_intersect(ctx, &inter_begin_pos,
+ &inter_end_pos);
+}
+
+int _bt_python_has_intersection(struct bt_context *ctx)
+{
+ int ret;
+ uint64_t begin = 0, end = ULLONG_MAX;
+
+ ret = ctf_find_packets_intersection(ctx, &begin, &end);
+
+ return ret == 0 ? 1 : 0;
+}
/* iterator */
struct bt_iter_pos *_bt_python_create_iter_pos(void);
+struct bt_ctf_iter *_bt_python_ctf_iter_create_intersect(
+ struct bt_context *ctx,
+ struct bt_iter_pos *inter_begin_pos,
+ struct bt_iter_pos *inter_end_pos);
+int _bt_python_has_intersection(struct bt_context *ctx);
trace from a trace collection.
"""
- def __init__(self):
+ def __init__(self, intersect_mode=False):
"""
Creates an empty trace collection.
"""
self._tc = nbt._bt_context_create()
+ self.intersect_mode = intersect_mode
def __del__(self):
nbt._bt_context_put(self._tc)
begin_pos_ptr = nbt._bt_python_create_iter_pos()
end_pos_ptr = nbt._bt_python_create_iter_pos()
- begin_pos_ptr.type = nbt.SEEK_BEGIN
- end_pos_ptr.type = nbt.SEEK_LAST
+
+ if not self.intersect_mode:
+ begin_pos_ptr.type = nbt.SEEK_BEGIN
+ end_pos_ptr.type = nbt.SEEK_LAST
for event in self._events(begin_pos_ptr, end_pos_ptr):
yield event
return ev.timestamp
def _events(self, begin_pos_ptr, end_pos_ptr):
- ctf_it_ptr = nbt._bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr)
+ if self.intersect_mode:
+ has_intersection = nbt._bt_python_has_intersection(self._tc)
+ if not has_intersection:
+ # There are no events to provide.
+ return
+
+ ctf_it_ptr = nbt._bt_python_ctf_iter_create_intersect(
+ self._tc, begin_pos_ptr, end_pos_ptr
+ )
+ else:
+ ctf_it_ptr = nbt._bt_ctf_iter_create(
+ self._tc, begin_pos_ptr, end_pos_ptr
+ )
if ctf_it_ptr is None:
raise NotImplementedError("Creation of multiple iterators is unsupported.")