const char *_bt_python_get_sequence_string(struct bt_definition *field);
int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field);
enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field);
+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_trace_collection_has_intersection(struct bt_context *ctx);
/* =================================================================
CONTEXT.H, CONTEXT-INTERNAL.H
The TraceCollection is the object that contains all currently opened traces.
"""
- def __init__(self):
+ def __init__(self, intersect_mode=False):
self._tc = _bt_context_create()
+ self._intersect_mode = intersect_mode
def __del__(self):
_bt_context_put(self._tc)
raise TypeError("in remove_trace, "
"argument 2 must be a TraceHandle instance")
+ @property
+ def intersect_mode(self):
+ return self._intersect_mode
+
+ @property
+ def has_intersection(self):
+ return _bt_python_trace_collection_has_intersection(self._tc)
+
@property
def events(self):
"""
event after the the generator has gone out of scope may result in a
crash or data corruption.
"""
- begin_pos_ptr = _bt_iter_pos()
- end_pos_ptr = _bt_iter_pos()
- begin_pos_ptr.type = SEEK_BEGIN
- end_pos_ptr.type = SEEK_LAST
+ begin_pos_ptr = _bt_python_create_iter_pos()
+ end_pos_ptr = _bt_python_create_iter_pos()
+ if not self.intersect_mode:
+ begin_pos_ptr.type = SEEK_BEGIN
+ end_pos_ptr.type = SEEK_LAST
for event in self._events(begin_pos_ptr, end_pos_ptr):
yield event
+ _bt_iter_free_pos(begin_pos_ptr)
+ _bt_iter_free_pos(end_pos_ptr)
+
def events_timestamps(self, timestamp_begin, timestamp_end):
"""
Generator function to iterate over the events of open in the current
TraceCollection from timestamp_begin to timestamp_end.
"""
- begin_pos_ptr = _bt_iter_pos()
- end_pos_ptr = _bt_iter_pos()
+ begin_pos_ptr = _bt_python_create_iter_pos()
+ end_pos_ptr = _bt_python_create_iter_pos()
begin_pos_ptr.type = end_pos_ptr.type = SEEK_TIME
begin_pos_ptr.u.seek_time = timestamp_begin
end_pos_ptr.u.seek_time = timestamp_end
for event in self._events(begin_pos_ptr, end_pos_ptr):
yield event
+ _bt_iter_free_pos(begin_pos_ptr)
+ _bt_iter_free_pos(end_pos_ptr)
+
@property
def timestamp_begin(self):
pos_ptr = _bt_iter_pos()
ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
_bt_ctf_iter_destroy(ctf_it_ptr)
if ev_ptr is None:
- return None;
+ return None
+ ev = Event.__new__(Event)
+ ev._e = ev_ptr
+ return ev.timestamp
def _events(self, begin_pos_ptr, end_pos_ptr):
- ctf_it_ptr = _bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr)
+ if self.intersect_mode:
+ if not self.has_intersection:
+ # There are no events to provide.
+ return
+
+ ctf_it_ptr = _bt_python_ctf_iter_create_intersect(
+ self._tc, begin_pos_ptr, end_pos_ptr
+ )
+ else:
+ ctf_it_ptr = _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.")
def _field_list_with_scope(self, scope):
fields = []
scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
-
+
# Returns a list [list_ptr, count]. If list_ptr is NULL, SWIG will only
# provide the "count" return value
count = 0