X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bindings%2Fpython%2Fbabeltrace.i.in;h=f9d2c736dff41636ec4b817c1978a5e662499800;hb=5f07b6ce3098d87af3d413a67dacb5e85b2bcafe;hp=f07f2fb7af025f321e3664c39d0f424121f2a39c;hpb=9132dc67804f7e868c21f759bf739ace4ce069b6;p=babeltrace.git diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index f07f2fb7..f9d2c736 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -100,6 +100,11 @@ 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_has_intersection(struct bt_context *ctx); /* ================================================================= CONTEXT.H, CONTEXT-INTERNAL.H @@ -134,8 +139,9 @@ class TraceCollection: 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) @@ -207,6 +213,14 @@ class TraceCollection: 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_has_intersection(self._tc) + @property def events(self): """ @@ -226,8 +240,9 @@ class TraceCollection: """ begin_pos_ptr = _bt_python_create_iter_pos() end_pos_ptr = _bt_python_create_iter_pos() - begin_pos_ptr.type = SEEK_BEGIN - end_pos_ptr.type = SEEK_LAST + 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 @@ -271,10 +286,25 @@ class TraceCollection: 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.") @@ -800,7 +830,7 @@ class Event(collections.Mapping): 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