bt2: clean available `bt2` package names
[babeltrace.git] / src / bindings / python / bt2 / bt2 / trace_class.py
CommitLineData
fbbe9302
SM
1# The MIT License (MIT)
2#
3# Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
4# Copyright (c) 2018 Francis Deslauriers <francis.deslauriers@efficios.com>
5# Copyright (c) 2019 Simon Marchi <simon.marchi@efficios.com>
6#
7# Permission is hereby granted, free of charge, to any person obtaining a copy
8# of this software and associated documentation files (the "Software"), to deal
9# in the Software without restriction, including without limitation the rights
10# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11# copies of the Software, and to permit persons to whom the Software is
12# furnished to do so, subject to the following conditions:
13#
14# The above copyright notice and this permission notice shall be included in
15# all copies or substantial portions of the Software.
16#
17# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23# THE SOFTWARE.
24
2c6f8520 25__all__ = ['_TraceClass']
fbbe9302
SM
26
27import bt2
28from bt2 import native_bt, utils, object
3fb99a22
PP
29from bt2 import stream_class as bt2_stream_class
30from bt2 import field_class as bt2_field_class
31from bt2 import trace as bt2_trace
32from bt2 import trace_class as bt2_trace_class
fbbe9302
SM
33import collections.abc
34import functools
35
36
fbbe9302
SM
37class _StreamClassIterator(collections.abc.Iterator):
38 def __init__(self, trace_class):
39 self._trace_class = trace_class
40 self._at = 0
41
42 def __next__(self):
43 if self._at == len(self._trace_class):
44 raise StopIteration
45
cfbd7cf3
FD
46 borrow_stream_class_fn = (
47 native_bt.trace_class_borrow_stream_class_by_index_const
48 )
fbbe9302
SM
49 sc_ptr = borrow_stream_class_fn(self._trace_class._ptr, self._at)
50 assert sc_ptr
51 id = native_bt.stream_class_get_id(sc_ptr)
52 assert id >= 0
53 self._at += 1
54 return id
55
56
57def _trace_class_destruction_listener_from_native(user_listener, trace_class_ptr):
3fb99a22 58 trace_class = bt2_trace_class._TraceClass._create_from_ptr_and_get_ref(
cfbd7cf3
FD
59 trace_class_ptr
60 )
fbbe9302
SM
61 user_listener(trace_class)
62
63
2c6f8520 64class _TraceClass(object._SharedObject, collections.abc.Mapping):
fbbe9302
SM
65 _get_ref = staticmethod(native_bt.trace_class_get_ref)
66 _put_ref = staticmethod(native_bt.trace_class_put_ref)
67
8c2367b8
SM
68 # Instantiate a trace of this class.
69
335a2da5 70 def __call__(self, name=None, uuid=None, env=None):
8c2367b8
SM
71 trace_ptr = native_bt.trace_create(self._ptr)
72
73 if trace_ptr is None:
694c792b 74 raise bt2._MemoryError('cannot create trace class object')
8c2367b8 75
3fb99a22 76 trace = bt2_trace._Trace._create_from_ptr(trace_ptr)
8c2367b8
SM
77
78 if name is not None:
79 trace._name = name
80
335a2da5
PP
81 if uuid is not None:
82 trace._uuid = uuid
83
84 if env is not None:
85 for key, value in env.items():
86 trace.env[key] = value
87
8c2367b8
SM
88 return trace
89
fbbe9302
SM
90 # Number of stream classes in this trace class.
91
92 def __len__(self):
93 count = native_bt.trace_class_get_stream_class_count(self._ptr)
94 assert count >= 0
95 return count
96
97 # Get a stream class by stream id.
98
99 def __getitem__(self, key):
100 utils._check_uint64(key)
101
102 sc_ptr = native_bt.trace_class_borrow_stream_class_by_id_const(self._ptr, key)
103 if sc_ptr is None:
104 raise KeyError(key)
105
3fb99a22 106 return bt2_stream_class._StreamClass._create_from_ptr_and_get_ref(sc_ptr)
fbbe9302
SM
107
108 def __iter__(self):
109 for idx in range(len(self)):
cfbd7cf3
FD
110 sc_ptr = native_bt.trace_class_borrow_stream_class_by_index_const(
111 self._ptr, idx
112 )
fbbe9302
SM
113 assert sc_ptr is not None
114
115 id = native_bt.stream_class_get_id(sc_ptr)
116 assert id >= 0
117
118 yield id
119
cfbd7cf3
FD
120 def create_stream_class(
121 self,
122 id=None,
123 name=None,
124 packet_context_field_class=None,
125 event_common_context_field_class=None,
126 default_clock_class=None,
127 assigns_automatic_event_class_id=True,
128 assigns_automatic_stream_id=True,
129 supports_packets=False,
130 packets_have_beginning_default_clock_snapshot=False,
131 packets_have_end_default_clock_snapshot=False,
132 supports_discarded_events=False,
133 discarded_events_have_default_clock_snapshots=False,
134 supports_discarded_packets=False,
135 discarded_packets_have_default_clock_snapshots=False,
136 ):
fbbe9302
SM
137
138 if self.assigns_automatic_stream_class_id:
139 if id is not None:
cfbd7cf3
FD
140 raise ValueError(
141 'id provided, but trace class assigns automatic stream class ids'
142 )
fbbe9302
SM
143
144 sc_ptr = native_bt.stream_class_create(self._ptr)
145 else:
146 if id is None:
cfbd7cf3
FD
147 raise ValueError(
148 'id not provided, but trace class does not assign automatic stream class ids'
149 )
fbbe9302
SM
150
151 utils._check_uint64(id)
152 sc_ptr = native_bt.stream_class_create_with_id(self._ptr, id)
153
3fb99a22 154 sc = bt2_stream_class._StreamClass._create_from_ptr(sc_ptr)
8c2367b8 155
3cdfbaea
SM
156 if name is not None:
157 sc._name = name
158
3cdfbaea
SM
159 if event_common_context_field_class is not None:
160 sc._event_common_context_field_class = event_common_context_field_class
161
162 if default_clock_class is not None:
163 sc._default_clock_class = default_clock_class
164
26fc5aed
PP
165 # call after `sc._default_clock_class` because, if
166 # `packets_have_beginning_default_clock_snapshot` or
167 # `packets_have_end_default_clock_snapshot` is true, then this
168 # stream class needs a default clock class already.
cfbd7cf3
FD
169 sc._set_supports_packets(
170 supports_packets,
171 packets_have_beginning_default_clock_snapshot,
172 packets_have_end_default_clock_snapshot,
173 )
26fc5aed
PP
174
175 # call after sc._set_supports_packets() because, if
176 # `packet_context_field_class` is not `None`, then this stream
177 # class needs to support packets already.
178 if packet_context_field_class is not None:
179 sc._packet_context_field_class = packet_context_field_class
180
3cdfbaea 181 sc._assigns_automatic_event_class_id = assigns_automatic_event_class_id
8c2367b8 182 sc._assigns_automatic_stream_id = assigns_automatic_stream_id
cfbd7cf3
FD
183 sc._set_supports_discarded_events(
184 supports_discarded_events, discarded_events_have_default_clock_snapshots
185 )
186 sc._set_supports_discarded_packets(
187 supports_discarded_packets, discarded_packets_have_default_clock_snapshots
188 )
8c2367b8 189 return sc
fbbe9302
SM
190
191 @property
192 def assigns_automatic_stream_class_id(self):
193 return native_bt.trace_class_assigns_automatic_stream_class_id(self._ptr)
194
195 def _assigns_automatic_stream_class_id(self, auto_id):
196 utils._check_bool(auto_id)
cfbd7cf3
FD
197 return native_bt.trace_class_set_assigns_automatic_stream_class_id(
198 self._ptr, auto_id
199 )
fbbe9302 200
cfbd7cf3
FD
201 _assigns_automatic_stream_class_id = property(
202 fset=_assigns_automatic_stream_class_id
203 )
fbbe9302 204
3cdfbaea
SM
205 # Field class creation methods.
206
207 def _check_create_status(self, ptr, type_name):
208 if ptr is None:
694c792b 209 raise bt2._MemoryError('cannot create {} field class'.format(type_name))
3cdfbaea 210
cfbd7cf3
FD
211 def _create_integer_field_class(
212 self, create_func, py_cls, type_name, field_value_range, preferred_display_base
213 ):
af4bbfc7
SM
214 field_class_ptr = create_func(self._ptr)
215 self._check_create_status(field_class_ptr, type_name)
216
217 field_class = py_cls._create_from_ptr(field_class_ptr)
218
d47b87ac
SM
219 if field_value_range is not None:
220 field_class._field_value_range = field_value_range
af4bbfc7 221
d47b87ac
SM
222 if preferred_display_base is not None:
223 field_class._preferred_display_base = preferred_display_base
af4bbfc7
SM
224
225 return field_class
226
cfbd7cf3
FD
227 def create_signed_integer_field_class(
228 self, field_value_range=None, preferred_display_base=None
229 ):
230 return self._create_integer_field_class(
9c08c816 231 native_bt.field_class_integer_signed_create,
3fb99a22 232 bt2_field_class._SignedIntegerFieldClass,
cfbd7cf3
FD
233 'signed integer',
234 field_value_range,
235 preferred_display_base,
236 )
237
238 def create_unsigned_integer_field_class(
239 self, field_value_range=None, preferred_display_base=None
240 ):
241 return self._create_integer_field_class(
9c08c816 242 native_bt.field_class_integer_unsigned_create,
3fb99a22 243 bt2_field_class._UnsignedIntegerFieldClass,
cfbd7cf3
FD
244 'unsigned integer',
245 field_value_range,
246 preferred_display_base,
247 )
248
249 def create_signed_enumeration_field_class(
250 self, field_value_range=None, preferred_display_base=None
251 ):
252 return self._create_integer_field_class(
9c08c816 253 native_bt.field_class_enumeration_signed_create,
3fb99a22 254 bt2_field_class._SignedEnumerationFieldClass,
cfbd7cf3
FD
255 'signed enumeration',
256 field_value_range,
257 preferred_display_base,
258 )
259
260 def create_unsigned_enumeration_field_class(
261 self, field_value_range=None, preferred_display_base=None
262 ):
263 return self._create_integer_field_class(
9c08c816 264 native_bt.field_class_enumeration_unsigned_create,
3fb99a22 265 bt2_field_class._UnsignedEnumerationFieldClass,
cfbd7cf3
FD
266 'unsigned enumeration',
267 field_value_range,
268 preferred_display_base,
269 )
2ae9f48c
SM
270
271 def create_real_field_class(self, is_single_precision=False):
272 field_class_ptr = native_bt.field_class_real_create(self._ptr)
273 self._check_create_status(field_class_ptr, 'real')
274
3fb99a22 275 field_class = bt2_field_class._RealFieldClass._create_from_ptr(field_class_ptr)
2ae9f48c 276
d47b87ac 277 field_class._is_single_precision = is_single_precision
2ae9f48c
SM
278
279 return field_class
280
3cdfbaea
SM
281 def create_structure_field_class(self):
282 field_class_ptr = native_bt.field_class_structure_create(self._ptr)
283 self._check_create_status(field_class_ptr, 'structure')
284
3fb99a22 285 return bt2_field_class._StructureFieldClass._create_from_ptr(field_class_ptr)
3cdfbaea
SM
286
287 def create_string_field_class(self):
288 field_class_ptr = native_bt.field_class_string_create(self._ptr)
289 self._check_create_status(field_class_ptr, 'string')
290
3fb99a22 291 return bt2_field_class._StringFieldClass._create_from_ptr(field_class_ptr)
d47b87ac
SM
292
293 def create_static_array_field_class(self, elem_fc, length):
3fb99a22 294 utils._check_type(elem_fc, bt2_field_class._FieldClass)
d47b87ac 295 utils._check_uint64(length)
9c08c816 296 ptr = native_bt.field_class_array_static_create(self._ptr, elem_fc._ptr, length)
d47b87ac
SM
297 self._check_create_status(ptr, 'static array')
298
3fb99a22 299 return bt2_field_class._StaticArrayFieldClass._create_from_ptr_and_get_ref(ptr)
d47b87ac
SM
300
301 def create_dynamic_array_field_class(self, elem_fc, length_fc=None):
3fb99a22 302 utils._check_type(elem_fc, bt2_field_class._FieldClass)
1367bc7c 303 length_fc_ptr = None
d47b87ac
SM
304
305 if length_fc is not None:
3fb99a22 306 utils._check_type(length_fc, bt2_field_class._UnsignedIntegerFieldClass)
1367bc7c 307 length_fc_ptr = length_fc._ptr
d47b87ac 308
9c08c816 309 ptr = native_bt.field_class_array_dynamic_create(
cfbd7cf3
FD
310 self._ptr, elem_fc._ptr, length_fc_ptr
311 )
1367bc7c 312 self._check_create_status(ptr, 'dynamic array')
3fb99a22 313 return bt2_field_class._DynamicArrayFieldClass._create_from_ptr(ptr)
d47b87ac
SM
314
315 def create_variant_field_class(self, selector_fc=None):
45c51519 316 selector_fc_ptr = None
d47b87ac
SM
317
318 if selector_fc is not None:
3fb99a22 319 utils._check_type(selector_fc, bt2_field_class._IntegerFieldClass)
45c51519 320 selector_fc_ptr = selector_fc._ptr
d47b87ac 321
45c51519
PP
322 ptr = native_bt.field_class_variant_create(self._ptr, selector_fc_ptr)
323 self._check_create_status(ptr, 'variant')
3fb99a22 324 return bt2_field_class._create_field_class_from_ptr_and_get_ref(ptr)
3cdfbaea 325
fbbe9302
SM
326 # Add a listener to be called when the trace class is destroyed.
327
328 def add_destruction_listener(self, listener):
329
330 if not callable(listener):
331 raise TypeError("'listener' parameter is not callable")
332
d24d5663 333 fn = native_bt.bt2_trace_class_add_destruction_listener
cfbd7cf3
FD
334 listener_from_native = functools.partial(
335 _trace_class_destruction_listener_from_native, listener
336 )
fbbe9302 337
ee2cad25
SM
338 status, listener_id = fn(self._ptr, listener_from_native)
339 utils._handle_func_status(
340 status, 'cannot add destruction listener to trace class object'
341 )
fbbe9302 342
3fb99a22 343 return utils._ListenerHandle(listener_id, self)
This page took 0.045292 seconds and 4 git commands to generate.