X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bindings%2Fpython%2Fbabeltrace.i.in;h=3dc1791010dc4202b34cb1346ca1a64b0ec9b20d;hb=adec6026f1deb3240ba4c64c739e2e588bc8398a;hp=c0dd3a0994424ba56dc962ac6c455904b2807f91;hpb=7569fbb1a48465f4399c7e3f8db72c9836c6ca8a;p=deliverable%2Fbabeltrace.git diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index c0dd3a099..3dc179101 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -93,9 +93,13 @@ struct definition_sequence *_bt_python_get_sequence_from_def( struct bt_definition *field); struct bt_declaration *_bt_python_get_array_element_declaration( struct bt_declaration *field); +struct bt_declaration *_bt_python_get_sequence_element_declaration( + struct bt_declaration *field); 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); /* ================================================================= CONTEXT.H, CONTEXT-INTERNAL.H @@ -208,22 +212,36 @@ class TraceCollection: """ Generator function to iterate over the events of open in the current TraceCollection. + + Due to limitations of the native Babeltrace API, only one event + may be "alive" at a time (i.e. a user should never store a copy + of the events returned by this function for ulterior use). Users + shall make sure to copy the information they need from an event + before accessing the next one. + + Furthermore, event objects become invalid when the generator goes + out of scope as the underlying iterator will be reclaimed. Using an + 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 = _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 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 @@ -231,6 +249,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() @@ -250,7 +271,10 @@ 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) @@ -952,6 +976,14 @@ class SequenceFieldDeclaration(FieldDeclaration): def __init__(self): raise NotImplementedError("SequenceFieldDeclaration cannot be instantiated") + @property + def element_declaration(self): + """ + Return element declaration. + """ + field_decl_ptr = _bt_python_get_sequence_element_declaration(self._fd) + return _create_field_declaration(field_decl_ptr, "", self.scope) + class FloatFieldDeclaration(FieldDeclaration): """Do not instantiate.""" def __init__(self): @@ -1179,11 +1211,17 @@ class _Definition(object): elif id == CTFTypeId.ENUM: value = self._get_enum_str() elif id == CTFTypeId.SEQUENCE: - seq_len = self._get_sequence_len() - value = [] - for i in range(seq_len): - evDef = self._get_sequence_element_at(i) - value.append(evDef.value) + element_decl = self.declaration.element_declaration + if ((element_decl.type == CTFTypeId.INTEGER + and element_decl.length == 8) + and (element_decl.encoding == CTFStringEncoding.ASCII or element_decl.encoding == CTFStringEncoding.UTF8)): + value = _bt_python_get_sequence_string(self._d) + else: + seq_len = self._get_sequence_len() + value = [] + for i in range(seq_len): + evDef = self._get_sequence_element_at(i) + value.append(evDef.value) elif id == CTFTypeId.FLOAT: value = self._get_float() elif id == CTFTypeId.VARIANT: