python: standardize intra-bt2 imports
[babeltrace.git] / src / bindings / python / bt2 / bt2 / trace_class.py
CommitLineData
0235b0db 1# SPDX-License-Identifier: MIT
fbbe9302
SM
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>
fbbe9302 6
e5914347
SM
7from bt2 import native_bt
8from bt2 import utils as bt2_utils
9from bt2 import object as bt2_object
3fb99a22
PP
10from bt2 import stream_class as bt2_stream_class
11from bt2 import field_class as bt2_field_class
0aa006b7 12from bt2 import integer_range_set as bt2_integer_range_set
3fb99a22 13from bt2 import trace as bt2_trace
5783664e 14from bt2 import value as bt2_value
fbbe9302
SM
15import collections.abc
16import functools
f0a42b33 17import bt2
fbbe9302
SM
18
19
67de22ba
SM
20def _trace_class_destruction_listener_from_native(
21 user_listener, handle, trace_class_ptr
22):
f0a42b33 23 trace_class = _TraceClass._create_from_ptr_and_get_ref(trace_class_ptr)
fbbe9302 24 user_listener(trace_class)
67de22ba 25 handle._invalidate()
fbbe9302
SM
26
27
e5914347 28class _TraceClassConst(bt2_object._SharedObject, collections.abc.Mapping):
9dee90bd
SM
29 @staticmethod
30 def _get_ref(ptr):
31 native_bt.trace_class_get_ref(ptr)
32
33 @staticmethod
34 def _put_ref(ptr):
35 native_bt.trace_class_put_ref(ptr)
36
f0a42b33
FD
37 _borrow_stream_class_ptr_by_index = staticmethod(
38 native_bt.trace_class_borrow_stream_class_by_index_const
39 )
40 _borrow_stream_class_ptr_by_id = staticmethod(
41 native_bt.trace_class_borrow_stream_class_by_id_const
42 )
2550c437
SM
43 _borrow_user_attributes_ptr = staticmethod(
44 native_bt.trace_class_borrow_user_attributes_const
45 )
f0a42b33
FD
46 _stream_class_pycls = bt2_stream_class._StreamClassConst
47 _create_value_from_ptr_and_get_ref = staticmethod(
48 bt2_value._create_from_const_ptr_and_get_ref
49 )
fbbe9302 50
f0a42b33
FD
51 @property
52 def user_attributes(self):
2550c437 53 ptr = self._borrow_user_attributes_ptr(self._ptr)
f0a42b33
FD
54 assert ptr is not None
55 return self._create_value_from_ptr_and_get_ref(ptr)
8c2367b8 56
fbbe9302
SM
57 # Number of stream classes in this trace class.
58
59 def __len__(self):
60 count = native_bt.trace_class_get_stream_class_count(self._ptr)
61 assert count >= 0
62 return count
63
64 # Get a stream class by stream id.
65
66 def __getitem__(self, key):
e5914347 67 bt2_utils._check_uint64(key)
fbbe9302 68
f0a42b33 69 sc_ptr = self._borrow_stream_class_ptr_by_id(self._ptr, key)
fbbe9302
SM
70 if sc_ptr is None:
71 raise KeyError(key)
72
f0a42b33 73 return self._stream_class_pycls._create_from_ptr_and_get_ref(sc_ptr)
fbbe9302
SM
74
75 def __iter__(self):
76 for idx in range(len(self)):
f0a42b33 77 sc_ptr = self._borrow_stream_class_ptr_by_index(self._ptr, idx)
fbbe9302
SM
78 assert sc_ptr is not None
79
80 id = native_bt.stream_class_get_id(sc_ptr)
81 assert id >= 0
82
83 yield id
84
f0a42b33
FD
85 @property
86 def assigns_automatic_stream_class_id(self):
87 return native_bt.trace_class_assigns_automatic_stream_class_id(self._ptr)
88
89 # Add a listener to be called when the trace class is destroyed.
90
91 def add_destruction_listener(self, listener):
f0a42b33
FD
92 if not callable(listener):
93 raise TypeError("'listener' parameter is not callable")
94
e5914347 95 handle = bt2_utils._ListenerHandle(self.addr)
67de22ba 96
f0a42b33 97 listener_from_native = functools.partial(
67de22ba 98 _trace_class_destruction_listener_from_native, listener, handle
f0a42b33
FD
99 )
100
67de22ba 101 fn = native_bt.bt2_trace_class_add_destruction_listener
f0a42b33 102 status, listener_id = fn(self._ptr, listener_from_native)
e5914347 103 bt2_utils._handle_func_status(
f5567ea8 104 status, "cannot add destruction listener to trace class object"
f0a42b33
FD
105 )
106
67de22ba
SM
107 handle._set_listener_id(listener_id)
108
109 return handle
f0a42b33 110
1114a7d5 111 def remove_destruction_listener(self, listener_handle):
e5914347 112 bt2_utils._check_type(listener_handle, bt2_utils._ListenerHandle)
1114a7d5 113
67de22ba 114 if listener_handle._addr != self.addr:
1114a7d5 115 raise ValueError(
f5567ea8 116 "This trace class destruction listener does not match the trace class object."
1114a7d5
SM
117 )
118
119 if listener_handle._listener_id is None:
120 raise ValueError(
f5567ea8 121 "This trace class destruction listener was already removed."
1114a7d5
SM
122 )
123
124 status = native_bt.trace_class_remove_destruction_listener(
125 self._ptr, listener_handle._listener_id
126 )
e5914347 127 bt2_utils._handle_func_status(status)
67de22ba 128 listener_handle._invalidate()
1114a7d5 129
f0a42b33
FD
130
131class _TraceClass(_TraceClassConst):
132 _borrow_stream_class_ptr_by_index = staticmethod(
133 native_bt.trace_class_borrow_stream_class_by_index
134 )
135 _borrow_stream_class_ptr_by_id = staticmethod(
136 native_bt.trace_class_borrow_stream_class_by_id
137 )
2550c437
SM
138 _borrow_user_attributes_ptr = staticmethod(
139 native_bt.trace_class_borrow_user_attributes
140 )
f0a42b33
FD
141 _stream_class_pycls = bt2_stream_class._StreamClass
142 _create_value_from_ptr_and_get_ref = staticmethod(
143 bt2_value._create_from_ptr_and_get_ref
144 )
145
146 # Instantiate a trace of this class.
147
148 def __call__(self, name=None, user_attributes=None, uuid=None, environment=None):
149 trace_ptr = native_bt.trace_create(self._ptr)
150
151 if trace_ptr is None:
f5567ea8 152 raise bt2._MemoryError("cannot create trace class object")
f0a42b33
FD
153
154 trace = bt2_trace._Trace._create_from_ptr(trace_ptr)
155
156 if name is not None:
157 trace._name = name
158
159 if user_attributes is not None:
160 trace._user_attributes = user_attributes
161
162 if uuid is not None:
163 trace._uuid = uuid
164
165 if environment is not None:
166 for key, value in environment.items():
167 trace.environment[key] = value
168
169 return trace
170
cfbd7cf3
FD
171 def create_stream_class(
172 self,
173 id=None,
174 name=None,
5783664e 175 user_attributes=None,
cfbd7cf3
FD
176 packet_context_field_class=None,
177 event_common_context_field_class=None,
178 default_clock_class=None,
179 assigns_automatic_event_class_id=True,
180 assigns_automatic_stream_id=True,
181 supports_packets=False,
182 packets_have_beginning_default_clock_snapshot=False,
183 packets_have_end_default_clock_snapshot=False,
184 supports_discarded_events=False,
185 discarded_events_have_default_clock_snapshots=False,
186 supports_discarded_packets=False,
187 discarded_packets_have_default_clock_snapshots=False,
188 ):
d3bf1370
SM
189 # Validate parameters before we create the object.
190 bt2_stream_class._StreamClass._validate_create_params(
191 name,
192 user_attributes,
193 packet_context_field_class,
194 event_common_context_field_class,
195 default_clock_class,
196 assigns_automatic_event_class_id,
197 assigns_automatic_stream_id,
198 supports_packets,
199 packets_have_beginning_default_clock_snapshot,
200 packets_have_end_default_clock_snapshot,
201 supports_discarded_events,
202 discarded_events_have_default_clock_snapshots,
203 supports_discarded_packets,
204 discarded_packets_have_default_clock_snapshots,
205 )
fbbe9302
SM
206
207 if self.assigns_automatic_stream_class_id:
208 if id is not None:
cfbd7cf3 209 raise ValueError(
f5567ea8 210 "id provided, but trace class assigns automatic stream class ids"
cfbd7cf3 211 )
fbbe9302
SM
212
213 sc_ptr = native_bt.stream_class_create(self._ptr)
214 else:
215 if id is None:
cfbd7cf3 216 raise ValueError(
f5567ea8 217 "id not provided, but trace class does not assign automatic stream class ids"
cfbd7cf3 218 )
fbbe9302 219
e5914347 220 bt2_utils._check_uint64(id)
fbbe9302
SM
221 sc_ptr = native_bt.stream_class_create_with_id(self._ptr, id)
222
3fb99a22 223 sc = bt2_stream_class._StreamClass._create_from_ptr(sc_ptr)
8c2367b8 224
3cdfbaea
SM
225 if name is not None:
226 sc._name = name
227
5783664e
PP
228 if user_attributes is not None:
229 sc._user_attributes = user_attributes
230
3cdfbaea
SM
231 if event_common_context_field_class is not None:
232 sc._event_common_context_field_class = event_common_context_field_class
233
234 if default_clock_class is not None:
235 sc._default_clock_class = default_clock_class
236
26fc5aed
PP
237 # call after `sc._default_clock_class` because, if
238 # `packets_have_beginning_default_clock_snapshot` or
239 # `packets_have_end_default_clock_snapshot` is true, then this
240 # stream class needs a default clock class already.
cfbd7cf3
FD
241 sc._set_supports_packets(
242 supports_packets,
243 packets_have_beginning_default_clock_snapshot,
244 packets_have_end_default_clock_snapshot,
245 )
26fc5aed
PP
246
247 # call after sc._set_supports_packets() because, if
248 # `packet_context_field_class` is not `None`, then this stream
249 # class needs to support packets already.
250 if packet_context_field_class is not None:
251 sc._packet_context_field_class = packet_context_field_class
252
3cdfbaea 253 sc._assigns_automatic_event_class_id = assigns_automatic_event_class_id
8c2367b8 254 sc._assigns_automatic_stream_id = assigns_automatic_stream_id
cfbd7cf3
FD
255 sc._set_supports_discarded_events(
256 supports_discarded_events, discarded_events_have_default_clock_snapshots
257 )
258 sc._set_supports_discarded_packets(
259 supports_discarded_packets, discarded_packets_have_default_clock_snapshots
260 )
8c2367b8 261 return sc
fbbe9302 262
5783664e
PP
263 def _user_attributes(self, user_attributes):
264 value = bt2_value.create_value(user_attributes)
e5914347 265 bt2_utils._check_type(value, bt2_value.MapValue)
5783664e
PP
266 native_bt.trace_class_set_user_attributes(self._ptr, value._ptr)
267
268 _user_attributes = property(fset=_user_attributes)
269
fbbe9302 270 def _assigns_automatic_stream_class_id(self, auto_id):
e5914347 271 bt2_utils._check_bool(auto_id)
cfbd7cf3
FD
272 return native_bt.trace_class_set_assigns_automatic_stream_class_id(
273 self._ptr, auto_id
274 )
fbbe9302 275
cfbd7cf3
FD
276 _assigns_automatic_stream_class_id = property(
277 fset=_assigns_automatic_stream_class_id
278 )
fbbe9302 279
3cdfbaea
SM
280 # Field class creation methods.
281
aae30e61 282 def _check_field_class_create_status(self, ptr, type_name):
3cdfbaea 283 if ptr is None:
f5567ea8 284 raise bt2._MemoryError("cannot create {} field class".format(type_name))
3cdfbaea 285
5783664e
PP
286 @staticmethod
287 def _set_field_class_user_attrs(fc, user_attributes):
288 if user_attributes is not None:
289 fc._user_attributes = user_attributes
290
291 def create_bool_field_class(self, user_attributes=None):
aae30e61 292 field_class_ptr = native_bt.field_class_bool_create(self._ptr)
f5567ea8 293 self._check_field_class_create_status(field_class_ptr, "boolean")
5783664e
PP
294 fc = bt2_field_class._BoolFieldClass._create_from_ptr(field_class_ptr)
295 self._set_field_class_user_attrs(fc, user_attributes)
296 return fc
aae30e61 297
5783664e 298 def create_bit_array_field_class(self, length, user_attributes=None):
e5914347 299 bt2_utils._check_uint64(length)
ead8c3d4
PP
300
301 if length < 1 or length > 64:
302 raise ValueError(
f5567ea8 303 "invalid length {}: expecting a value in the [1, 64] range".format(
ead8c3d4
PP
304 length
305 )
306 )
307
308 field_class_ptr = native_bt.field_class_bit_array_create(self._ptr, length)
f5567ea8 309 self._check_field_class_create_status(field_class_ptr, "bit array")
5783664e
PP
310 fc = bt2_field_class._BitArrayFieldClass._create_from_ptr(field_class_ptr)
311 self._set_field_class_user_attrs(fc, user_attributes)
312 return fc
ead8c3d4 313
cfbd7cf3 314 def _create_integer_field_class(
5783664e
PP
315 self,
316 create_func,
317 py_cls,
318 type_name,
319 field_value_range,
320 preferred_display_base,
321 user_attributes,
cfbd7cf3 322 ):
af4bbfc7 323 field_class_ptr = create_func(self._ptr)
aae30e61 324 self._check_field_class_create_status(field_class_ptr, type_name)
af4bbfc7
SM
325
326 field_class = py_cls._create_from_ptr(field_class_ptr)
327
d47b87ac
SM
328 if field_value_range is not None:
329 field_class._field_value_range = field_value_range
af4bbfc7 330
d47b87ac
SM
331 if preferred_display_base is not None:
332 field_class._preferred_display_base = preferred_display_base
af4bbfc7 333
5783664e 334 self._set_field_class_user_attrs(field_class, user_attributes)
af4bbfc7
SM
335 return field_class
336
cfbd7cf3 337 def create_signed_integer_field_class(
5783664e 338 self, field_value_range=None, preferred_display_base=None, user_attributes=None
cfbd7cf3
FD
339 ):
340 return self._create_integer_field_class(
9c08c816 341 native_bt.field_class_integer_signed_create,
3fb99a22 342 bt2_field_class._SignedIntegerFieldClass,
f5567ea8 343 "signed integer",
cfbd7cf3
FD
344 field_value_range,
345 preferred_display_base,
5783664e 346 user_attributes,
cfbd7cf3
FD
347 )
348
349 def create_unsigned_integer_field_class(
5783664e 350 self, field_value_range=None, preferred_display_base=None, user_attributes=None
cfbd7cf3
FD
351 ):
352 return self._create_integer_field_class(
9c08c816 353 native_bt.field_class_integer_unsigned_create,
3fb99a22 354 bt2_field_class._UnsignedIntegerFieldClass,
f5567ea8 355 "unsigned integer",
cfbd7cf3
FD
356 field_value_range,
357 preferred_display_base,
5783664e 358 user_attributes,
cfbd7cf3
FD
359 )
360
361 def create_signed_enumeration_field_class(
5783664e 362 self, field_value_range=None, preferred_display_base=None, user_attributes=None
cfbd7cf3
FD
363 ):
364 return self._create_integer_field_class(
9c08c816 365 native_bt.field_class_enumeration_signed_create,
3fb99a22 366 bt2_field_class._SignedEnumerationFieldClass,
f5567ea8 367 "signed enumeration",
cfbd7cf3
FD
368 field_value_range,
369 preferred_display_base,
5783664e 370 user_attributes,
cfbd7cf3
FD
371 )
372
373 def create_unsigned_enumeration_field_class(
5783664e 374 self, field_value_range=None, preferred_display_base=None, user_attributes=None
cfbd7cf3
FD
375 ):
376 return self._create_integer_field_class(
9c08c816 377 native_bt.field_class_enumeration_unsigned_create,
3fb99a22 378 bt2_field_class._UnsignedEnumerationFieldClass,
f5567ea8 379 "unsigned enumeration",
cfbd7cf3
FD
380 field_value_range,
381 preferred_display_base,
5783664e 382 user_attributes,
cfbd7cf3 383 )
2ae9f48c 384
fe4df857
FD
385 def create_single_precision_real_field_class(self, user_attributes=None):
386 field_class_ptr = native_bt.field_class_real_single_precision_create(self._ptr)
f5567ea8 387 self._check_field_class_create_status(field_class_ptr, "single-precision real")
2ae9f48c 388
fe4df857
FD
389 field_class = bt2_field_class._SinglePrecisionRealFieldClass._create_from_ptr(
390 field_class_ptr
391 )
392
393 self._set_field_class_user_attrs(field_class, user_attributes)
394
395 return field_class
396
397 def create_double_precision_real_field_class(self, user_attributes=None):
398 field_class_ptr = native_bt.field_class_real_double_precision_create(self._ptr)
f5567ea8 399 self._check_field_class_create_status(field_class_ptr, "double-precision real")
fe4df857
FD
400
401 field_class = bt2_field_class._DoublePrecisionRealFieldClass._create_from_ptr(
402 field_class_ptr
403 )
2ae9f48c 404
5783664e 405 self._set_field_class_user_attrs(field_class, user_attributes)
2ae9f48c
SM
406
407 return field_class
408
5783664e 409 def create_structure_field_class(self, user_attributes=None):
3cdfbaea 410 field_class_ptr = native_bt.field_class_structure_create(self._ptr)
f5567ea8 411 self._check_field_class_create_status(field_class_ptr, "structure")
5783664e
PP
412 fc = bt2_field_class._StructureFieldClass._create_from_ptr(field_class_ptr)
413 self._set_field_class_user_attrs(fc, user_attributes)
414 return fc
3cdfbaea 415
5783664e 416 def create_string_field_class(self, user_attributes=None):
3cdfbaea 417 field_class_ptr = native_bt.field_class_string_create(self._ptr)
f5567ea8 418 self._check_field_class_create_status(field_class_ptr, "string")
5783664e
PP
419 fc = bt2_field_class._StringFieldClass._create_from_ptr(field_class_ptr)
420 self._set_field_class_user_attrs(fc, user_attributes)
421 return fc
3cdfbaea 422
5783664e 423 def create_static_array_field_class(self, elem_fc, length, user_attributes=None):
e5914347
SM
424 bt2_utils._check_type(elem_fc, bt2_field_class._FieldClass)
425 bt2_utils._check_uint64(length)
9c08c816 426 ptr = native_bt.field_class_array_static_create(self._ptr, elem_fc._ptr, length)
f5567ea8 427 self._check_field_class_create_status(ptr, "static array")
2bebdd7f 428 fc = bt2_field_class._StaticArrayFieldClass._create_from_ptr(ptr)
5783664e
PP
429 self._set_field_class_user_attrs(fc, user_attributes)
430 return fc
d47b87ac 431
5783664e
PP
432 def create_dynamic_array_field_class(
433 self, elem_fc, length_fc=None, user_attributes=None
434 ):
e5914347 435 bt2_utils._check_type(elem_fc, bt2_field_class._FieldClass)
1367bc7c 436 length_fc_ptr = None
d47b87ac
SM
437
438 if length_fc is not None:
e5914347 439 bt2_utils._check_type(length_fc, bt2_field_class._UnsignedIntegerFieldClass)
1367bc7c 440 length_fc_ptr = length_fc._ptr
d47b87ac 441
9c08c816 442 ptr = native_bt.field_class_array_dynamic_create(
cfbd7cf3
FD
443 self._ptr, elem_fc._ptr, length_fc_ptr
444 )
f5567ea8 445 self._check_field_class_create_status(ptr, "dynamic array")
2bebdd7f 446 fc = bt2_field_class._obj_type_from_field_class_ptr(ptr)._create_from_ptr(ptr)
5783664e
PP
447 self._set_field_class_user_attrs(fc, user_attributes)
448 return fc
d47b87ac 449
0aa006b7
PP
450 def create_option_without_selector_field_class(
451 self, content_fc, user_attributes=None
5783664e 452 ):
e5914347 453 bt2_utils._check_type(content_fc, bt2_field_class._FieldClass)
0aa006b7
PP
454 ptr = native_bt.field_class_option_without_selector_create(
455 self._ptr, content_fc._ptr
456 )
f5567ea8 457 self._check_field_class_create_status(ptr, "option")
2bebdd7f 458 fc = bt2_field_class._obj_type_from_field_class_ptr(ptr)._create_from_ptr(ptr)
0aa006b7
PP
459 self._set_field_class_user_attrs(fc, user_attributes)
460 return fc
cec0261d 461
0aa006b7
PP
462 def create_option_with_bool_selector_field_class(
463 self, content_fc, selector_fc, selector_is_reversed=False, user_attributes=None
464 ):
e5914347
SM
465 bt2_utils._check_type(content_fc, bt2_field_class._FieldClass)
466 bt2_utils._check_bool(selector_is_reversed)
467 bt2_utils._check_type(selector_fc, bt2_field_class._BoolFieldClass)
de821fe5 468 ptr = native_bt.field_class_option_with_selector_field_bool_create(
0aa006b7
PP
469 self._ptr, content_fc._ptr, selector_fc._ptr
470 )
f5567ea8 471 self._check_field_class_create_status(ptr, "option")
2bebdd7f 472 fc = bt2_field_class._obj_type_from_field_class_ptr(ptr)._create_from_ptr(ptr)
0aa006b7
PP
473 self._set_field_class_user_attrs(fc, user_attributes)
474 fc._selector_is_reversed = selector_is_reversed
475 return fc
cec0261d 476
0aa006b7
PP
477 def create_option_with_integer_selector_field_class(
478 self, content_fc, selector_fc, ranges, user_attributes=None
479 ):
e5914347
SM
480 bt2_utils._check_type(content_fc, bt2_field_class._FieldClass)
481 bt2_utils._check_type(selector_fc, bt2_field_class._IntegerFieldClass)
0aa006b7
PP
482
483 if len(ranges) == 0:
f5567ea8 484 raise ValueError("integer range set is empty")
0aa006b7
PP
485
486 if isinstance(selector_fc, bt2_field_class._UnsignedIntegerFieldClass):
e5914347 487 bt2_utils._check_type(ranges, bt2_integer_range_set.UnsignedIntegerRangeSet)
de821fe5 488 ptr = native_bt.field_class_option_with_selector_field_integer_unsigned_create(
0aa006b7
PP
489 self._ptr, content_fc._ptr, selector_fc._ptr, ranges._ptr
490 )
491 else:
e5914347 492 bt2_utils._check_type(ranges, bt2_integer_range_set.SignedIntegerRangeSet)
776a2a25
PP
493 ptr = (
494 native_bt.field_class_option_with_selector_field_integer_signed_create(
495 self._ptr, content_fc._ptr, selector_fc._ptr, ranges._ptr
496 )
0aa006b7 497 )
cec0261d 498
f5567ea8 499 self._check_field_class_create_status(ptr, "option")
2bebdd7f 500 fc = bt2_field_class._obj_type_from_field_class_ptr(ptr)._create_from_ptr(ptr)
5783664e
PP
501 self._set_field_class_user_attrs(fc, user_attributes)
502 return fc
cec0261d 503
5783664e 504 def create_variant_field_class(self, selector_fc=None, user_attributes=None):
45c51519 505 selector_fc_ptr = None
d47b87ac
SM
506
507 if selector_fc is not None:
e5914347 508 bt2_utils._check_type(selector_fc, bt2_field_class._IntegerFieldClass)
45c51519 509 selector_fc_ptr = selector_fc._ptr
d47b87ac 510
45c51519 511 ptr = native_bt.field_class_variant_create(self._ptr, selector_fc_ptr)
f5567ea8 512 self._check_field_class_create_status(ptr, "variant")
2bebdd7f 513 fc = bt2_field_class._obj_type_from_field_class_ptr(ptr)._create_from_ptr(ptr)
5783664e
PP
514 self._set_field_class_user_attrs(fc, user_attributes)
515 return fc
This page took 0.09197 seconds and 4 git commands to generate.