X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=bindings%2Fpython%2Fbabeltrace.i.in;h=f3a00f588fde0d4ca267d6c155ef54792770045d;hp=c8e4923077fd0d95731d14cff97f3d84d039e204;hb=90131a325727abff135b9d67f814c79269ec5d13;hpb=bb919dd077169b5ee049ba3fc82f8555648cb22e diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index c8e49230..f3a00f58 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -45,7 +45,6 @@ trace to it." #include #include #include -#include #include #include #include "python-complements.h" @@ -63,8 +62,8 @@ typedef int bt_intern_str; %rename("_bt_context_create") bt_context_create(void); %rename("_bt_context_add_trace") bt_context_add_trace( struct bt_context *ctx, const char *path, const char *format, - void (*packet_seek)(struct stream_pos *pos, size_t index, int whence), - struct mmap_stream_list *stream_list, FILE *metadata); + void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence), + struct bt_mmap_stream_list *stream_list, FILE *metadata); %rename("_bt_context_remove_trace") bt_context_remove_trace( struct bt_context *ctx, int trace_id); %rename("_bt_context_get") bt_context_get(struct bt_context *ctx); @@ -74,8 +73,8 @@ typedef int bt_intern_str; struct bt_context *bt_context_create(void); int bt_context_add_trace(struct bt_context *ctx, const char *path, const char *format, - void (*packet_seek)(struct stream_pos *pos, size_t index, int whence), - struct mmap_stream_list *stream_list, FILE *metadata); + void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence), + struct bt_mmap_stream_list *stream_list, FILE *metadata); void bt_context_remove_trace(struct bt_context *ctx, int trace_id); void bt_context_get(struct bt_context *ctx); void bt_context_put(struct bt_context *ctx); @@ -189,13 +188,12 @@ class Context: %rename("lookup_format") bt_lookup_format(bt_intern_str qname); %rename("_bt_print_format_list") bt_fprintf_format_list(FILE *fp); %rename("register_format") bt_register_format(struct format *format); +%rename("unregister_format") bt_unregister_format(struct bt_format *format); extern struct format *bt_lookup_format(bt_intern_str qname); extern void bt_fprintf_format_list(FILE *fp); -extern int bt_register_format(struct format *format); - -void format_init(void); -void format_finalize(void); +extern int bt_register_format(struct bt_format *format); +extern void bt_unregister_format(struct bt_format *format); %pythoncode %{ @@ -245,8 +243,7 @@ struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter, uint64_t times %rename("SEEK_RESTORE") BT_SEEK_RESTORE; %rename("SEEK_CUR") BT_SEEK_CUR; %rename("SEEK_BEGIN") BT_SEEK_BEGIN; -%rename("SEEK_END") BT_SEEK_END; - +%rename("SEEK_LAST") BT_SEEK_LAST; // This struct is taken from iterator.h // All changes to the struct must also be made here @@ -256,7 +253,7 @@ struct bt_iter_pos { BT_SEEK_RESTORE, /* uses u.restore */ BT_SEEK_CUR, BT_SEEK_BEGIN, - BT_SEEK_END, + BT_SEEK_LAST } type; union { uint64_t seek_time; @@ -456,8 +453,6 @@ void bt_trace_handle_destroy(struct bt_trace_handle *bt); struct bt_context *ctx, int handle_id, enum bt_clock_type type); %rename("_bt_trace_handle_get_timestamp_end") bt_trace_handle_get_timestamp_end( struct bt_context *ctx, int handle_id, enum bt_clock_type type); -%rename("_bt_trace_handle_get_id") bt_trace_handle_get_id(struct bt_trace_handle *th); -int bt_trace_handle_get_id(struct bt_trace_handle *th); const char *bt_trace_handle_get_path(struct bt_context *ctx, int handle_id); uint64_t bt_trace_handle_get_timestamp_begin(struct bt_context *ctx, int handle_id, enum bt_clock_type type); @@ -482,7 +477,7 @@ class TraceHandle(object): raise NotImplementedError("TraceHandle cannot be instantiated") def __repr__(self): - return "Babeltrace TraceHandle: trace_id('{}')".format(self._id) + return "Babeltrace TraceHandle: trace_id('{0}')".format(self._id) def get_id(self): """Return the TraceHandle id.""" @@ -554,55 +549,68 @@ struct bt_ctf_event *bt_ctf_iter_read_event(struct bt_ctf_iter *iter); const struct bt_ctf_event *ctf_event); %rename("_bt_ctf_get_field") bt_ctf_get_field(const struct bt_ctf_event *ctf_event, - const struct definition *scope, const char *field); + const struct bt_definition *scope, const char *field); %rename("_bt_ctf_get_index") bt_ctf_get_index(const struct bt_ctf_event *ctf_event, - const struct definition *field, unsigned int index); -%rename("_bt_ctf_field_name") bt_ctf_field_name(const struct definition *def); -%rename("_bt_ctf_field_type") bt_ctf_field_type(const struct definition *def); + const struct bt_definition *field, unsigned int index); +%rename("_bt_ctf_field_name") bt_ctf_field_name(const struct bt_definition *field); +%rename("_bt_ctf_field_type") bt_ctf_field_type(const struct bt_declaration *field); %rename("_bt_ctf_get_int_signedness") bt_ctf_get_int_signedness( - const struct definition *field); -%rename("_bt_ctf_get_int_base") bt_ctf_get_int_base(const struct definition *field); + const struct bt_declaration *field); +%rename("_bt_ctf_get_int_base") bt_ctf_get_int_base(const struct bt_declaration *field); %rename("_bt_ctf_get_int_byte_order") bt_ctf_get_int_byte_order( - const struct definition *field); -%rename("_bt_ctf_get_int_len") bt_ctf_get_int_len(const struct definition *field); -%rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct definition *field); -%rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct definition *field); -%rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct definition *field); -%rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct definition *field); -%rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct definition *field); -%rename("_bt_ctf_get_string") bt_ctf_get_string(const struct definition *field); + const struct bt_declaration *field); +%rename("_bt_ctf_get_int_len") bt_ctf_get_int_len(const struct bt_declaration *field); +%rename("_bt_ctf_get_enum_int") bt_ctf_get_enum_int(const struct bt_definition *field); +%rename("_bt_ctf_get_enum_str") bt_ctf_get_enum_str(const struct bt_definition *field); +%rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct bt_declaration *field); +%rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct bt_declaration *field); +%rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct bt_definition *field); +%rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct bt_definition *field); +%rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field); +%rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field); %rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void); %rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event); %rename("_bt_ctf_get_decl_field_name") bt_ctf_get_decl_field_name( const struct bt_ctf_field_decl *field); +%rename("_bt_ctf_get_decl_from_def") bt_ctf_get_decl_from_def( + const struct bt_definition *field); +%rename("_bt_array_index") bt_array_index(struct definition_array *array, uint64_t i); +%rename("_bt_sequence_len") bt_sequence_len(struct definition_sequence *sequence); +%rename("_bt_sequence_index") bt_sequence_index(struct definition_sequence *sequence, uint64_t i); -const struct definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event, +const struct bt_definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event, enum bt_ctf_scope scope); const char *bt_ctf_event_name(const struct bt_ctf_event *ctf_event); uint64_t bt_ctf_get_timestamp(const struct bt_ctf_event *ctf_event); uint64_t bt_ctf_get_cycles(const struct bt_ctf_event *ctf_event); -const struct definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event, - const struct definition *scope, +const struct bt_definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event, + const struct bt_definition *scope, const char *field); -const struct definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event, - const struct definition *field, +const struct bt_definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event, + const struct bt_definition *field, unsigned int index); -const char *bt_ctf_field_name(const struct definition *def); -enum ctf_type_id bt_ctf_field_type(const struct definition *def); -int bt_ctf_get_int_signedness(const struct definition *field); -int bt_ctf_get_int_base(const struct definition *field); -int bt_ctf_get_int_byte_order(const struct definition *field); -ssize_t bt_ctf_get_int_len(const struct definition *field); -enum ctf_string_encoding bt_ctf_get_encoding(const struct definition *field); -int bt_ctf_get_array_len(const struct definition *field); -uint64_t bt_ctf_get_uint64(const struct definition *field); -int64_t bt_ctf_get_int64(const struct definition *field); -char *bt_ctf_get_char_array(const struct definition *field); -char *bt_ctf_get_string(const struct definition *field); +const char *bt_ctf_field_name(const struct bt_definition *field); +enum ctf_type_id bt_ctf_field_type(const struct bt_declaration *field); +int bt_ctf_get_int_signedness(const struct bt_declaration *field); +int bt_ctf_get_int_base(const struct bt_declaration *field); +int bt_ctf_get_int_byte_order(const struct bt_declaration *field); +ssize_t bt_ctf_get_int_len(const struct bt_declaration *field); +const struct bt_definition *bt_ctf_get_enum_int(const struct bt_definition *field); +const char *bt_ctf_get_enum_str(const struct bt_definition *field); +enum ctf_string_encoding bt_ctf_get_encoding(const struct bt_declaration *field); +int bt_ctf_get_array_len(const struct bt_declaration *field); +struct bt_definition *bt_array_index(struct definition_array *array, uint64_t i); +uint64_t bt_ctf_get_uint64(const struct bt_definition *field); +int64_t bt_ctf_get_int64(const struct bt_definition *field); +char *bt_ctf_get_char_array(const struct bt_definition *field); +char *bt_ctf_get_string(const struct bt_definition *field); int bt_ctf_field_get_error(void); const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event); const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field); +const struct bt_declaration *bt_ctf_get_decl_from_def(const struct bt_definition *field); +uint64_t bt_sequence_len(struct definition_sequence *sequence); +struct bt_definition *bt_sequence_index(struct definition_sequence *sequence, uint64_t i); %pythoncode%{ @@ -624,6 +632,15 @@ class ctf: SEQUENCE = 9 NR_CTF_TYPES = 10 + def get_type_id_name(id): + name = "UNKNOWN" + constants = [attr for attr in dir(ctf.type_id) if not callable(getattr(ctf.type_id, attr)) and not attr.startswith("__")] + for attr in constants: + if getattr(ctf.type_id, attr) == id: + name = attr + break + return name + class scope: TRACE_PACKET_HEADER = 0 STREAM_PACKET_CONTEXT = 1 @@ -746,19 +763,48 @@ class ctf: """ return _bt_ctf_get_timestamp(self._e) - def get_field(self, scope, field): - """Return the definition of a specific field.""" + def get_field_with_scope(self, scope, field): + """ + Return the definition of a specific field. + Return None on error. + """ evDef = ctf.Definition.__new__(ctf.Definition) try: evDef._d = _bt_ctf_get_field(self._e, scope._d, field) except AttributeError: raise TypeError("in get_field, argument 2 must be a " "Definition (scope) instance") + if evDef._d is None: + return None + evDef._s = scope return evDef - def get_field_list(self, scope): + def get_field(self, field): + """ + Return the definition of fields by a name + Return None on error + """ + eventScope = self.get_top_level_scope(ctf.scope.EVENT_FIELDS) + streamScope = self.get_top_level_scope(ctf.scope.STREAM_EVENT_CONTEXT) + fields_by_name = [] + + if eventScope is not None: + evDef = self.get_field_with_scope(eventScope, field) + if evDef is not None: + fields_by_name.append(evDef) + + if streamScope is not None: + evDef = self.get_field_with_scope(streamScope, field) + if evDef is not None: + fields_by_name.append(evDef); + + if not fields_by_name: + return None + return fields_by_name + + def get_field_list_with_scope(self, scope): """ - Return a list of Definitions + Return a list of Definitions associated with the scope Return None on error. """ try: @@ -781,10 +827,31 @@ class ctf: #_bt_python_field_listcaller break + tmp._s = scope def_list.append(tmp) i += 1 return def_list + def get_field_list(self): + """Return a list of Definitions or None on error.""" + eventScope = self.get_top_level_scope(ctf.scope.EVENT_FIELDS) + streamScope = self.get_top_level_scope(ctf.scope.STREAM_EVENT_CONTEXT) + + def_list = [] + if eventScope is not None: + event_field_list = self.get_field_list_with_scope(eventScope) + if event_field_list is not None: + def_list = event_field_list + + if streamScope is not None: + event_field_list = self.get_field_list_with_scope(streamScope) + if event_field_list is not None: + def_list.extend(event_field_list) + + if not def_list: + return None + return def_list + def get_index(self, field, index): """ If the field is an array or a sequence, return the element @@ -826,6 +893,12 @@ class ctf: else: return ctx + class FieldError(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) class Definition(object): """Definition class. Do not instantiate.""" @@ -834,7 +907,7 @@ class ctf: raise NotImplementedError("ctf.Definition cannot be instantiated") def __repr__(self): - return "Babeltrace Definition: name('{}'), type({})".format( + return "Babeltrace Definition: name('{0}'), type({1})".format( self.field_name(), self.field_type()) def field_name(self): @@ -843,46 +916,89 @@ class ctf: def field_type(self): """Return the type of a field or -1 if unknown.""" - return _bt_ctf_field_type(self._d) + return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d)) def get_int_signedness(self): """ Return the signedness of an integer: 0 if unsigned; 1 if signed; -1 on error. """ - return _bt_ctf_get_int_signedness(self._d) + return _bt_ctf_get_int_signedness(_bt_ctf_get_decl_from_def(self._d)) def get_int_base(self): """Return the base of an int or a negative value on error.""" - return _bt_ctf_get_int_base(self._d) + return _bt_ctf_get_int_base(_bt_ctf_get_decl_from_def(self._d)) def get_int_byte_order(self): """ Return the byte order of an int or a negative value on error. """ - return _bt_ctf_get_int_byte_order(self._d) + return _bt_ctf_get_int_byte_order(_bt_ctf_get_decl_from_def(self._d)) def get_int_len(self): """ Return the size, in bits, of an int or a negative value on error. """ - return _bt_ctf_get_int_len(self._d) + return _bt_ctf_get_int_len(_bt_ctf_get_decl_from_def(self._d)) + + def get_enum_str(self): + """ + Return the string matching the current enumeration. + Return None on error. + """ + return _bt_ctf_get_enum_str(self._d) def get_encoding(self): """ Return the encoding of an int or a string. Return a negative value on error. """ - return _bt_ctf_get_encoding(self._d) + return _bt_ctf_get_encoding(_bt_ctf_get_decl_from_def(self._d)) def get_array_len(self): """ Return the len of an array or a negative value on error. """ - return _bt_ctf_get_array_len(self._d) + return _bt_ctf_get_array_len(_bt_ctf_get_decl_from_def(self._d)) + + def get_array_element_at(self, index): + """ + Return the array's element at position index. + Return None on error + """ + array = _bt_python_get_array_from_def(self._d) + if array is None: + return None + + element = ctf.Definition.__new__(ctf.Definition) + element._d = _bt_array_index(array, index) + if element._d is None: + return None + return element + + def get_sequence_len(self): + """ + Return the len of a sequence or a negative + value on error. + """ + seq = _bt_python_get_sequence_from_def(self._d) + return _bt_sequence_len(seq) + + def get_sequence_element_at(self, index): + """ + Return the sequence's element at position index, + otherwise return None + """ + seq = _bt_python_get_sequence_from_def(self._d) + if seq is not None: + element = ctf.Definition.__new__(ctf.Definition) + element._d = _bt_sequence_index(seq, index) + if element._d is not None: + return element + return None def get_uint64(self): """ @@ -920,6 +1036,40 @@ class ctf: """ return _bt_ctf_get_string(self._d) + def get_value(self): + """ + Return the value associated with the field according to its type. + Return None on error. + """ + id = self.field_type() + value = None + if id == ctf.type_id.STRING: + value = self.get_str() + elif id == ctf.type_id.ARRAY: + value = [] + for i in range(self.get_array_len()): + element = self.get_array_element_at(i) + value.append(element.get_value()) + elif id == ctf.type_id.INTEGER: + if self.get_int_signedness() == 0: + value = self.get_uint64() + else: + value = self.get_int64() + elif id == ctf.type_id.ENUM: + value = self.get_enum_str() + elif id == ctf.type_id.SEQUENCE: + seq_len = self.get_sequence_len() + value = [] + for i in range(seq_len): + evDef = self.get_sequence_element_at(i) + value.append(evDef.get_value()) + if ctf.field_error(): + raise ctf.FieldError("Error occured while accessing field {} of type {}".format(self.field_name(), ctf.type_id.get_type_id_name(self.field_type()))) + return value + + def get_scope(self): + """Return the scope of a field or None on error.""" + return self._s class EventDecl(object): """Event declaration class. Do not instantiate.""" @@ -928,7 +1078,7 @@ class ctf: raise NotImplementedError("ctf.EventDecl cannot be instantiated") def __repr__(self): - return "Babeltrace EventDecl: name {}".format(self.get_name()) + return "Babeltrace EventDecl: name {0}".format(self.get_name()) def get_name(self): """Return the name of the event or None on error""" @@ -967,7 +1117,7 @@ class ctf: raise NotImplementedError("ctf.FieldDecl cannot be instantiated") def __repr__(self): - return "Babeltrace FieldDecl: name {}".format(self.get_name()) + return "Babeltrace FieldDecl: name {0}".format(self.get_name()) def get_name(self): """Return the name of a FieldDecl or None on error""" @@ -1087,7 +1237,7 @@ class File(object): stat = 'opened' else: stat = 'closed' - return "{} babeltrace File; file_path('{}'), mode('{}')".format( + return "{0} babeltrace File; file_path('{1}'), mode('{2}')".format( stat, self._file_path, self._mode) def close(self):