1 from bt2
import native_bt
2 from collections
import abc
5 class ComponentClassType
:
6 SOURCE
= native_bt
.COMPONENT_CLASS_TYPE_SOURCE
7 FILTER
= native_bt
.COMPONENT_CLASS_TYPE_FILTER
8 SINK
= native_bt
.COMPONENT_CLASS_TYPE_SINK
11 _COMPONENT_CLASS_TYPE_TO_STR
= {
12 native_bt
.COMPONENT_CLASS_TYPE_SOURCE
: 'source',
13 native_bt
.COMPONENT_CLASS_TYPE_FILTER
: 'filter',
14 native_bt
.COMPONENT_CLASS_TYPE_SINK
: 'sink',
18 def _create_error_cause_from_ptr(ptr
):
19 actor_type
= native_bt
.error_cause_get_actor_type(ptr
)
20 return _ACTOR_TYPE_TO_CLS
[actor_type
](ptr
)
24 def __init__(self
, ptr
):
25 self
._message
= native_bt
.error_cause_get_message(ptr
)
26 self
._module
_name
= native_bt
.error_cause_get_module_name(ptr
)
27 self
._file
_name
= native_bt
.error_cause_get_file_name(ptr
)
28 self
._line
_number
= native_bt
.error_cause_get_line_number(ptr
)
31 s
= '[{}] ({}:{})\n'.format(self
.module_name
, self
.file_name
, self
.line_number
)
40 def module_name(self
):
41 return self
._module
_name
45 return self
._file
_name
48 def line_number(self
):
49 return self
._line
_number
52 class _ComponentErrorCause(_ErrorCause
):
53 def __init__(self
, ptr
):
55 self
._component
_name
= native_bt
.error_cause_component_actor_get_component_name(
58 self
._component
_class
_type
= native_bt
.error_cause_component_actor_get_component_class_type(
61 self
._component
_class
_name
= native_bt
.error_cause_component_actor_get_component_class_name(
64 self
._plugin
_name
= native_bt
.error_cause_component_actor_get_plugin_name(ptr
)
67 def component_name(self
):
68 return self
._component
_name
71 def component_class_type(self
):
72 return self
._component
_class
_type
75 def component_class_name(self
):
76 return self
._component
_class
_name
79 def plugin_name(self
):
80 return self
._plugin
_name
83 class _ComponentClassErrorCause(_ErrorCause
):
84 def __init__(self
, ptr
):
86 self
._component
_class
_type
= native_bt
.error_cause_component_class_actor_get_component_class_type(
89 self
._component
_class
_name
= native_bt
.error_cause_component_class_actor_get_component_class_name(
92 self
._plugin
_name
= native_bt
.error_cause_component_class_actor_get_plugin_name(
97 def component_class_type(self
):
98 return self
._component
_class
_type
101 def component_class_name(self
):
102 return self
._component
_class
_name
105 def plugin_name(self
):
106 return self
._plugin
_name
109 class _MessageIteratorErrorCause(_ErrorCause
):
110 def __init__(self
, ptr
):
111 super().__init
__(ptr
)
112 self
._component
_name
= native_bt
.error_cause_message_iterator_actor_get_component_name(
115 self
._component
_output
_port
_name
= native_bt
.error_cause_message_iterator_actor_get_component_output_port_name(
118 self
._component
_class
_type
= native_bt
.error_cause_message_iterator_actor_get_component_class_type(
121 self
._component
_class
_name
= native_bt
.error_cause_message_iterator_actor_get_component_class_name(
124 self
._plugin
_name
= native_bt
.error_cause_message_iterator_actor_get_plugin_name(
129 def component_name(self
):
130 return self
._component
_name
133 def component_output_port_name(self
):
134 return self
._component
_output
_port
_name
137 def component_class_type(self
):
138 return self
._component
_class
_type
141 def component_class_name(self
):
142 return self
._component
_class
_name
145 def plugin_name(self
):
146 return self
._plugin
_name
149 _ACTOR_TYPE_TO_CLS
= {
150 native_bt
.ERROR_CAUSE_ACTOR_TYPE_UNKNOWN
: _ErrorCause
,
151 native_bt
.ERROR_CAUSE_ACTOR_TYPE_COMPONENT
: _ComponentErrorCause
,
152 native_bt
.ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS
: _ComponentClassErrorCause
,
153 native_bt
.ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR
: _MessageIteratorErrorCause
,
157 class _Error(Exception, abc
.Sequence
):
159 Babeltrace API call error.
161 This exception is raised when a call to the Babeltrace API returns with
162 the ERROR or MEMORY_ERROR status codes.
165 def __init__(self
, msg
, ptr
=None):
166 super().__init
__(msg
)
167 # Steal the current thread's error.
168 self
._ptr
= native_bt
.current_thread_take_error()
169 assert self
._ptr
is not None
173 # Read everything we might need from the error pointer, so we don't
174 # depend on it. It's possible for the user to keep an Error object
175 # and to want to read its causes after the error pointer has been
176 # restored as the current thread's error (and is therefore
178 cause_count
= native_bt
.error_get_cause_count(self
._ptr
)
180 # We expect the library to append at least one cause (otherwise there
181 # wouldn't be an bt_error object anyway). Also, while formatting the
182 # exception, the Python `traceback` module does:
184 # if (exc_value and ...):
186 # If the cause list was empty, this would evaluate to False (which we
187 # wouldn't want), because of the __bool__ implementation of
188 # abc.Sequence. If there's at least one cause, we are sure that
189 # __bool__ will always return True and avoid any problem here.
190 assert cause_count
> 0
194 for i
in range(cause_count
):
195 cause_ptr
= native_bt
.error_borrow_cause_by_index(self
._ptr
, i
)
196 assert cause_ptr
is not None
197 cause
= _create_error_cause_from_ptr(cause_ptr
)
198 self
._causes
.append(cause
)
201 # If this exception escapes all the way out of the Python code, the
202 # native code will steal `_ptr` to restore it as the current thread's
203 # error. If the exception is caught and discarded by the Python code,
204 # the exception object still owns the error, so we must release it.
205 if self
._ptr
is not None:
206 native_bt
.error_release(self
._ptr
)
208 def __getitem__(self
, index
):
209 return self
._causes
[index
]
212 return len(self
._causes
)