# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-__all__ = ['_TraceClass']
-
-import bt2
from bt2 import native_bt, utils, object
from bt2 import stream_class as bt2_stream_class
from bt2 import field_class as bt2_field_class
+from bt2 import integer_range_set as bt2_integer_range_set
from bt2 import trace as bt2_trace
-from bt2 import trace_class as bt2_trace_class
from bt2 import value as bt2_value
import collections.abc
import functools
+import bt2
def _trace_class_destruction_listener_from_native(user_listener, trace_class_ptr):
- trace_class = bt2_trace_class._TraceClass._create_from_ptr_and_get_ref(
- trace_class_ptr
- )
+ trace_class = _TraceClass._create_from_ptr_and_get_ref(trace_class_ptr)
user_listener(trace_class)
-class _TraceClass(object._SharedObject, collections.abc.Mapping):
+class _TraceClassConst(object._SharedObject, collections.abc.Mapping):
_get_ref = staticmethod(native_bt.trace_class_get_ref)
_put_ref = staticmethod(native_bt.trace_class_put_ref)
+ _borrow_stream_class_ptr_by_index = staticmethod(
+ native_bt.trace_class_borrow_stream_class_by_index_const
+ )
+ _borrow_stream_class_ptr_by_id = staticmethod(
+ native_bt.trace_class_borrow_stream_class_by_id_const
+ )
+ _borrow_user_attributes_ptr = staticmethod(
+ native_bt.trace_class_borrow_user_attributes_const
+ )
+ _stream_class_pycls = bt2_stream_class._StreamClassConst
+ _create_value_from_ptr_and_get_ref = staticmethod(
+ bt2_value._create_from_const_ptr_and_get_ref
+ )
- # Instantiate a trace of this class.
-
- def __call__(self, name=None, user_attributes=None, uuid=None, env=None):
- trace_ptr = native_bt.trace_create(self._ptr)
-
- if trace_ptr is None:
- raise bt2._MemoryError('cannot create trace class object')
-
- trace = bt2_trace._Trace._create_from_ptr(trace_ptr)
-
- if name is not None:
- trace._name = name
-
- if user_attributes is not None:
- trace._user_attributes = user_attributes
-
- if uuid is not None:
- trace._uuid = uuid
-
- if env is not None:
- for key, value in env.items():
- trace.env[key] = value
-
- return trace
+ @property
+ def user_attributes(self):
+ ptr = self._borrow_user_attributes_ptr(self._ptr)
+ assert ptr is not None
+ return self._create_value_from_ptr_and_get_ref(ptr)
# Number of stream classes in this trace class.
def __getitem__(self, key):
utils._check_uint64(key)
- sc_ptr = native_bt.trace_class_borrow_stream_class_by_id_const(self._ptr, key)
+ sc_ptr = self._borrow_stream_class_ptr_by_id(self._ptr, key)
if sc_ptr is None:
raise KeyError(key)
- return bt2_stream_class._StreamClass._create_from_ptr_and_get_ref(sc_ptr)
+ return self._stream_class_pycls._create_from_ptr_and_get_ref(sc_ptr)
def __iter__(self):
for idx in range(len(self)):
- sc_ptr = native_bt.trace_class_borrow_stream_class_by_index_const(
- self._ptr, idx
- )
+ sc_ptr = self._borrow_stream_class_ptr_by_index(self._ptr, idx)
assert sc_ptr is not None
id = native_bt.stream_class_get_id(sc_ptr)
yield id
+ @property
+ def assigns_automatic_stream_class_id(self):
+ return native_bt.trace_class_assigns_automatic_stream_class_id(self._ptr)
+
+ # Add a listener to be called when the trace class is destroyed.
+
+ def add_destruction_listener(self, listener):
+
+ if not callable(listener):
+ raise TypeError("'listener' parameter is not callable")
+
+ fn = native_bt.bt2_trace_class_add_destruction_listener
+ listener_from_native = functools.partial(
+ _trace_class_destruction_listener_from_native, listener
+ )
+
+ status, listener_id = fn(self._ptr, listener_from_native)
+ utils._handle_func_status(
+ status, 'cannot add destruction listener to trace class object'
+ )
+
+ return utils._ListenerHandle(listener_id, self)
+
+ def remove_destruction_listener(self, listener_handle):
+ utils._check_type(listener_handle, utils._ListenerHandle)
+
+ if listener_handle._obj.addr != self.addr:
+ raise ValueError(
+ 'This trace class destruction listener does not match the trace class object.'
+ )
+
+ if listener_handle._listener_id is None:
+ raise ValueError(
+ 'This trace class destruction listener was already removed.'
+ )
+
+ status = native_bt.trace_class_remove_destruction_listener(
+ self._ptr, listener_handle._listener_id
+ )
+ utils._handle_func_status(status)
+ listener_handle._listener_id = None
+
+
+class _TraceClass(_TraceClassConst):
+ _borrow_stream_class_ptr_by_index = staticmethod(
+ native_bt.trace_class_borrow_stream_class_by_index
+ )
+ _borrow_stream_class_ptr_by_id = staticmethod(
+ native_bt.trace_class_borrow_stream_class_by_id
+ )
+ _borrow_user_attributes_ptr = staticmethod(
+ native_bt.trace_class_borrow_user_attributes
+ )
+ _stream_class_pycls = bt2_stream_class._StreamClass
+ _create_value_from_ptr_and_get_ref = staticmethod(
+ bt2_value._create_from_ptr_and_get_ref
+ )
+
+ # Instantiate a trace of this class.
+
+ def __call__(self, name=None, user_attributes=None, uuid=None, environment=None):
+ trace_ptr = native_bt.trace_create(self._ptr)
+
+ if trace_ptr is None:
+ raise bt2._MemoryError('cannot create trace class object')
+
+ trace = bt2_trace._Trace._create_from_ptr(trace_ptr)
+
+ if name is not None:
+ trace._name = name
+
+ if user_attributes is not None:
+ trace._user_attributes = user_attributes
+
+ if uuid is not None:
+ trace._uuid = uuid
+
+ if environment is not None:
+ for key, value in environment.items():
+ trace.environment[key] = value
+
+ return trace
+
def create_stream_class(
self,
id=None,
supports_discarded_packets=False,
discarded_packets_have_default_clock_snapshots=False,
):
+ # Validate parameters before we create the object.
+ bt2_stream_class._StreamClass._validate_create_params(
+ name,
+ user_attributes,
+ packet_context_field_class,
+ event_common_context_field_class,
+ default_clock_class,
+ assigns_automatic_event_class_id,
+ assigns_automatic_stream_id,
+ supports_packets,
+ packets_have_beginning_default_clock_snapshot,
+ packets_have_end_default_clock_snapshot,
+ supports_discarded_events,
+ discarded_events_have_default_clock_snapshots,
+ supports_discarded_packets,
+ discarded_packets_have_default_clock_snapshots,
+ )
if self.assigns_automatic_stream_class_id:
if id is not None:
)
return sc
- @property
- def user_attributes(self):
- ptr = native_bt.trace_class_borrow_user_attributes(self._ptr)
- assert ptr is not None
- return bt2_value._create_from_ptr_and_get_ref(ptr)
-
def _user_attributes(self, user_attributes):
value = bt2_value.create_value(user_attributes)
utils._check_type(value, bt2_value.MapValue)
_user_attributes = property(fset=_user_attributes)
- @property
- def assigns_automatic_stream_class_id(self):
- return native_bt.trace_class_assigns_automatic_stream_class_id(self._ptr)
-
def _assigns_automatic_stream_class_id(self, auto_id):
utils._check_bool(auto_id)
return native_bt.trace_class_set_assigns_automatic_stream_class_id(
user_attributes,
)
- def create_real_field_class(self, is_single_precision=False, user_attributes=None):
- field_class_ptr = native_bt.field_class_real_create(self._ptr)
- self._check_field_class_create_status(field_class_ptr, 'real')
+ def create_single_precision_real_field_class(self, user_attributes=None):
+ field_class_ptr = native_bt.field_class_real_single_precision_create(self._ptr)
+ self._check_field_class_create_status(field_class_ptr, 'single-precision real')
- field_class = bt2_field_class._RealFieldClass._create_from_ptr(field_class_ptr)
+ field_class = bt2_field_class._SinglePrecisionRealFieldClass._create_from_ptr(
+ field_class_ptr
+ )
+
+ self._set_field_class_user_attrs(field_class, user_attributes)
+
+ return field_class
+
+ def create_double_precision_real_field_class(self, user_attributes=None):
+ field_class_ptr = native_bt.field_class_real_double_precision_create(self._ptr)
+ self._check_field_class_create_status(field_class_ptr, 'double-precision real')
+
+ field_class = bt2_field_class._DoublePrecisionRealFieldClass._create_from_ptr(
+ field_class_ptr
+ )
- field_class._is_single_precision = is_single_precision
self._set_field_class_user_attrs(field_class, user_attributes)
return field_class
self._ptr, elem_fc._ptr, length_fc_ptr
)
self._check_field_class_create_status(ptr, 'dynamic array')
- fc = bt2_field_class._DynamicArrayFieldClass._create_from_ptr(ptr)
+ fc = bt2_field_class._create_field_class_from_ptr_and_get_ref(ptr)
self._set_field_class_user_attrs(fc, user_attributes)
return fc
- def create_option_field_class(
- self, content_fc, selector_fc=None, user_attributes=None
+ def create_option_without_selector_field_class(
+ self, content_fc, user_attributes=None
):
utils._check_type(content_fc, bt2_field_class._FieldClass)
+ ptr = native_bt.field_class_option_without_selector_create(
+ self._ptr, content_fc._ptr
+ )
+ self._check_field_class_create_status(ptr, 'option')
+ fc = bt2_field_class._create_field_class_from_ptr_and_get_ref(ptr)
+ self._set_field_class_user_attrs(fc, user_attributes)
+ return fc
- selector_fc_ptr = None
+ def create_option_with_bool_selector_field_class(
+ self, content_fc, selector_fc, selector_is_reversed=False, user_attributes=None
+ ):
+ utils._check_type(content_fc, bt2_field_class._FieldClass)
+ utils._check_bool(selector_is_reversed)
+ utils._check_type(selector_fc, bt2_field_class._BoolFieldClass)
+ ptr = native_bt.field_class_option_with_selector_field_bool_create(
+ self._ptr, content_fc._ptr, selector_fc._ptr
+ )
+ self._check_field_class_create_status(ptr, 'option')
+ fc = bt2_field_class._create_field_class_from_ptr_and_get_ref(ptr)
+ self._set_field_class_user_attrs(fc, user_attributes)
+ fc._selector_is_reversed = selector_is_reversed
+ return fc
- if selector_fc is not None:
- utils._check_type(selector_fc, bt2_field_class._BoolFieldClass)
- selector_fc_ptr = selector_fc._ptr
+ def create_option_with_integer_selector_field_class(
+ self, content_fc, selector_fc, ranges, user_attributes=None
+ ):
+ utils._check_type(content_fc, bt2_field_class._FieldClass)
+ utils._check_type(selector_fc, bt2_field_class._IntegerFieldClass)
+
+ if len(ranges) == 0:
+ raise ValueError('integer range set is empty')
+
+ if isinstance(selector_fc, bt2_field_class._UnsignedIntegerFieldClass):
+ utils._check_type(ranges, bt2_integer_range_set.UnsignedIntegerRangeSet)
+ ptr = native_bt.field_class_option_with_selector_field_integer_unsigned_create(
+ self._ptr, content_fc._ptr, selector_fc._ptr, ranges._ptr
+ )
+ else:
+ utils._check_type(ranges, bt2_integer_range_set.SignedIntegerRangeSet)
+ ptr = native_bt.field_class_option_with_selector_field_integer_signed_create(
+ self._ptr, content_fc._ptr, selector_fc._ptr, ranges._ptr
+ )
- ptr = native_bt.field_class_option_create(
- self._ptr, content_fc._ptr, selector_fc_ptr
- )
self._check_field_class_create_status(ptr, 'option')
fc = bt2_field_class._create_field_class_from_ptr_and_get_ref(ptr)
self._set_field_class_user_attrs(fc, user_attributes)
fc = bt2_field_class._create_field_class_from_ptr_and_get_ref(ptr)
self._set_field_class_user_attrs(fc, user_attributes)
return fc
-
- # Add a listener to be called when the trace class is destroyed.
-
- def add_destruction_listener(self, listener):
-
- if not callable(listener):
- raise TypeError("'listener' parameter is not callable")
-
- fn = native_bt.bt2_trace_class_add_destruction_listener
- listener_from_native = functools.partial(
- _trace_class_destruction_listener_from_native, listener
- )
-
- status, listener_id = fn(self._ptr, listener_from_native)
- utils._handle_func_status(
- status, 'cannot add destruction listener to trace class object'
- )
-
- return utils._ListenerHandle(listener_id, self)