X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=bindings%2Fpython%2Fbabeltrace.i.in;h=aaa102094d6740da590c93ba831b124516b592e4;hp=5142952ec5fdeac715a28e01510354b29ed68f07;hb=a9049b491173a73f8544a16a95ab4e5375f28466;hpb=19ae15ed55fb6857ff469b60a3f3cbe32590c6e2 diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index 5142952e..aaa10209 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -99,6 +99,12 @@ const char *_bt_python_get_array_string(struct bt_definition *field); 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 @@ -133,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) @@ -206,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): """ @@ -223,21 +238,25 @@ class TraceCollection: 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 @@ -245,6 +264,9 @@ class TraceCollection: 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() @@ -264,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.") @@ -793,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