예제 #1
0
    def __init__(self):
        ptr = native_bt.interrupter_create()

        if ptr is None:
            raise bt2._MemoryError('cannot create interrupter object')

        super().__init__(ptr)
예제 #2
0
    def _create_packet_end_message(self, packet, default_clock_snapshot=None):
        utils._check_type(packet, bt2_packet._Packet)

        if packet.stream.cls.packets_have_end_default_clock_snapshot:
            if default_clock_snapshot is None:
                raise ValueError(
                    "packet end messages in this stream must have a default clock snapshot"
                )

            utils._check_uint64(default_clock_snapshot)
            ptr = native_bt.message_packet_end_create_with_default_clock_snapshot(
                self._bt_ptr, packet._ptr, default_clock_snapshot)
        else:
            if default_clock_snapshot is not None:
                raise ValueError(
                    "packet end messages in this stream must not have a default clock snapshot"
                )

            ptr = native_bt.message_packet_end_create(self._bt_ptr,
                                                      packet._ptr)

        if ptr is None:
            raise bt2._MemoryError('cannot create packet end message object')

        return bt2_message._PacketEndMessage(ptr)
예제 #3
0
def _handle_func_status(status, msg=None):
    if status == native_bt.__BT_FUNC_STATUS_OK:
        # no error
        return

    if status == native_bt.__BT_FUNC_STATUS_ERROR:
        assert msg is not None
        raise bt2._Error(msg)
    elif status == native_bt.__BT_FUNC_STATUS_MEMORY_ERROR:
        assert msg is not None
        raise bt2._MemoryError(msg)
    elif status == native_bt.__BT_FUNC_STATUS_END:
        if msg is None:
            raise bt2.Stop
        else:
            raise bt2.Stop(msg)
    elif status == native_bt.__BT_FUNC_STATUS_AGAIN:
        if msg is None:
            raise bt2.TryAgain
        else:
            raise bt2.TryAgain(msg)
    elif status == native_bt.__BT_FUNC_STATUS_OVERFLOW_ERROR:
        if msg is None:
            raise bt2._OverflowError
        else:
            raise bt2._OverflowError(msg)
    elif status == native_bt.__BT_FUNC_STATUS_UNKNOWN_OBJECT:
        if msg is None:
            raise bt2.UnknownObject
        else:
            raise bt2.UnknownObject(msg)
    else:
        assert False
예제 #4
0
    def __init__(self):
        ptr = native_bt.graph_create()

        if ptr is None:
            raise bt2._MemoryError('cannot create graph object')

        super().__init__(ptr)
예제 #5
0
    def __init__(cls, class_name, bases, namespace, **kwargs):
        super().__init__(class_name, bases, namespace)

        # skip our own bases; they are never directly instantiated by the user
        own_bases = (
            '_UserComponent',
            '_UserFilterSinkComponent',
            '_UserSourceComponent',
            '_UserFilterComponent',
            '_UserSinkComponent',
        )

        if class_name in own_bases:
            return

        comp_cls_name = kwargs.get('name', class_name)
        utils._check_str(comp_cls_name)
        comp_cls_descr = None
        comp_cls_help = None

        if hasattr(cls, '__doc__') and cls.__doc__ is not None:
            utils._check_str(cls.__doc__)
            docstring = _trim_docstring(cls.__doc__)
            lines = docstring.splitlines()

            if len(lines) >= 1:
                comp_cls_descr = lines[0]

            if len(lines) >= 3:
                comp_cls_help = '\n'.join(lines[2:])

        iter_cls = kwargs.get('message_iterator_class')

        if _UserSourceComponent in bases:
            _UserComponentType._bt_set_iterator_class(cls, iter_cls)
            cc_ptr = native_bt.bt2_component_class_source_create(
                cls, comp_cls_name, comp_cls_descr, comp_cls_help)
        elif _UserFilterComponent in bases:
            _UserComponentType._bt_set_iterator_class(cls, iter_cls)
            cc_ptr = native_bt.bt2_component_class_filter_create(
                cls, comp_cls_name, comp_cls_descr, comp_cls_help)
        elif _UserSinkComponent in bases:
            if not hasattr(cls, '_user_consume'):
                raise bt2._IncompleteUserClass(
                    "cannot create component class '{}': missing a _user_consume() method"
                    .format(class_name))

            cc_ptr = native_bt.bt2_component_class_sink_create(
                cls, comp_cls_name, comp_cls_descr, comp_cls_help)
        else:
            raise bt2._IncompleteUserClass(
                "cannot find a known component class base in the bases of '{}'"
                .format(class_name))

        if cc_ptr is None:
            raise bt2._MemoryError(
                "cannot create component class '{}'".format(class_name))

        cls._bt_cc_ptr = cc_ptr
예제 #6
0
    def _create_message_iterator_inactivity_message(self, clock_class,
                                                    clock_snapshot):
        utils._check_type(clock_class, bt2_clock_class._ClockClass)
        ptr = native_bt.message_message_iterator_inactivity_create(
            self._bt_ptr, clock_class._ptr, clock_snapshot)

        if ptr is None:
            raise bt2._MemoryError('cannot create inactivity message object')

        return bt2_message._MessageIteratorInactivityMessage(ptr)
예제 #7
0
    def _create_trace_class(self, assigns_automatic_stream_class_id=True):
        ptr = self._bt_as_self_component_ptr(self._bt_ptr)
        tc_ptr = native_bt.trace_class_create(ptr)

        if tc_ptr is None:
            raise bt2._MemoryError('could not create trace class')

        tc = bt2_trace_class._TraceClass._create_from_ptr(tc_ptr)
        tc._assigns_automatic_stream_class_id = assigns_automatic_stream_class_id

        return tc
예제 #8
0
    def create_packet(self):
        if not self.cls.supports_packets:
            raise ValueError(
                'cannot create packet: stream class does not support packets')

        packet_ptr = native_bt.packet_create(self._ptr)

        if packet_ptr is None:
            raise bt2._MemoryError('cannot create packet object')

        return bt2_packet._Packet._create_from_ptr(packet_ptr)
예제 #9
0
    def __init__(self, mip_version=0):
        utils._check_uint64(mip_version)

        if mip_version > bt2.get_maximal_mip_version():
            raise ValueError('unknown MIP version {}'.format(mip_version))

        ptr = native_bt.graph_create(mip_version)

        if ptr is None:
            raise bt2._MemoryError('cannot create graph object')

        super().__init__(ptr)
예제 #10
0
    def __init__(self, ranges=None):
        ptr = self._create_range_set()

        if ptr is None:
            raise bt2._MemoryError('cannot create range set object')

        super().__init__(ptr)

        if ranges is not None:
            # will raise if not iterable
            for rg in ranges:
                self.add(rg)
예제 #11
0
    def _create_stream_end_message(self, stream, default_clock_snapshot=None):
        utils._check_type(stream, bt2_stream._Stream)

        ptr = native_bt.message_stream_end_create(self._bt_ptr, stream._ptr)
        if ptr is None:
            raise bt2._MemoryError('cannot create stream end message object')

        msg = bt2_message._StreamEndMessage(ptr)

        if default_clock_snapshot is not None:
            msg._default_clock_snapshot = default_clock_snapshot

        return msg
예제 #12
0
    def __init__(self,
                 component_class,
                 object_name,
                 params=None,
                 method_obj=None):
        if not isinstance(component_class,
                          _bt2_component()._ComponentClassConst):
            err = False

            try:
                if not issubclass(component_class,
                                  _bt2_component()._UserComponent):
                    err = True
            except TypeError:
                err = True

            if err:
                o = component_class
                raise TypeError(
                    "'{}' is not a component class object".format(o))

        utils._check_str(object_name)

        if params is None:
            params_ptr = native_bt.value_null
        else:
            params = bt2.create_value(params)
            params_ptr = params._ptr

        cc_ptr = component_class._bt_component_class_ptr()
        assert cc_ptr is not None

        if method_obj is not None and not native_bt.bt2_is_python_component_class(
                cc_ptr):
            raise ValueError(
                'cannot pass a Python object to a non-Python component class')

        ptr = native_bt.bt2_query_executor_create(cc_ptr, object_name,
                                                  params_ptr, method_obj)

        if ptr is None:
            raise bt2._MemoryError('cannot create query executor object')

        super().__init__(ptr)

        # Keep a reference of `method_obj` as the native query executor
        # does not have any. This ensures that, when this object's
        # query() method is called, the Python object still exists.
        self._method_obj = method_obj
예제 #13
0
    def __init__(self, mip_version=0):
        utils._check_uint64(mip_version)

        if mip_version > bt2.get_maximal_mip_version():
            raise ValueError('unknown MIP version {}'.format(mip_version))

        ptr = native_bt.graph_create(mip_version)

        if ptr is None:
            raise bt2._MemoryError('cannot create graph object')

        super().__init__(ptr)

        # list of listener partials to keep a reference as long as
        # this graph exists
        self._listener_partials = []
예제 #14
0
    def _create_discarded_packets_message(self,
                                          stream,
                                          count=None,
                                          beg_clock_snapshot=None,
                                          end_clock_snapshot=None):
        utils._check_type(stream, bt2_stream._Stream)

        if not stream.cls.supports_discarded_packets:
            raise ValueError('stream class does not support discarded packets')

        if stream.cls.discarded_packets_have_default_clock_snapshots:
            if beg_clock_snapshot is None or end_clock_snapshot is None:
                raise ValueError(
                    'discarded packets have default clock snapshots for this stream class'
                )

            utils._check_uint64(beg_clock_snapshot)
            utils._check_uint64(end_clock_snapshot)

            if beg_clock_snapshot > end_clock_snapshot:
                raise ValueError(
                    'beginning default clock snapshot value ({}) is greater than end default clock snapshot value ({})'
                    .format(beg_clock_snapshot, end_clock_snapshot))

            ptr = (
                native_bt.
                message_discarded_packets_create_with_default_clock_snapshots(
                    self._bt_ptr, stream._ptr, beg_clock_snapshot,
                    end_clock_snapshot))
        else:
            if beg_clock_snapshot is not None or end_clock_snapshot is not None:
                raise ValueError(
                    'discarded packets have no default clock snapshots for this stream class'
                )

            ptr = native_bt.message_discarded_packets_create(
                self._bt_ptr, stream._ptr)

        if ptr is None:
            raise bt2._MemoryError('cannot discarded packets message object')

        msg = bt2_message._DiscardedPacketsMessage(ptr)

        if count is not None:
            msg._count = count

        return msg
예제 #15
0
    def _create_event_message(self,
                              event_class,
                              parent,
                              default_clock_snapshot=None):
        utils._check_type(event_class, bt2_event_class._EventClass)

        if event_class.stream_class.supports_packets:
            utils._check_type(parent, bt2_packet._Packet)
        else:
            utils._check_type(parent, bt2_stream._Stream)

        if default_clock_snapshot is not None:
            if event_class.stream_class.default_clock_class is None:
                raise ValueError(
                    'event messages in this stream must not have a default clock snapshot'
                )

            utils._check_uint64(default_clock_snapshot)

            if event_class.stream_class.supports_packets:
                ptr = native_bt.message_event_create_with_packet_and_default_clock_snapshot(
                    self._bt_ptr, event_class._ptr, parent._ptr,
                    default_clock_snapshot)
            else:
                ptr = native_bt.message_event_create_with_default_clock_snapshot(
                    self._bt_ptr, event_class._ptr, parent._ptr,
                    default_clock_snapshot)
        else:
            if event_class.stream_class.default_clock_class is not None:
                raise ValueError(
                    'event messages in this stream must have a default clock snapshot'
                )

            if event_class.stream_class.supports_packets:
                ptr = native_bt.message_event_create_with_packet(
                    self._bt_ptr, event_class._ptr, parent._ptr)
            else:
                ptr = native_bt.message_event_create(self._bt_ptr,
                                                     event_class._ptr,
                                                     parent._ptr)

        if ptr is None:
            raise bt2._MemoryError('cannot create event message object')

        return bt2_message._EventMessage(ptr)
예제 #16
0
    def _create_clock_class(
        self,
        frequency=None,
        name=None,
        user_attributes=None,
        description=None,
        precision=None,
        offset=None,
        origin_is_unix_epoch=True,
        uuid=None,
    ):
        ptr = self._bt_as_self_component_ptr(self._bt_ptr)
        cc_ptr = native_bt.clock_class_create(ptr)

        if cc_ptr is None:
            raise bt2._MemoryError('could not create clock class')

        cc = bt2_clock_class._ClockClass._create_from_ptr(cc_ptr)

        if frequency is not None:
            cc._frequency = frequency

        if name is not None:
            cc._name = name

        if user_attributes is not None:
            cc._user_attributes = user_attributes

        if description is not None:
            cc._description = description

        if precision is not None:
            cc._precision = precision

        if offset is not None:
            cc._offset = offset

        cc._origin_is_unix_epoch = origin_is_unix_epoch

        if uuid is not None:
            cc._uuid = uuid

        return cc
예제 #17
0
    def __call__(self, name=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 uuid is not None:
            trace._uuid = uuid

        if env is not None:
            for key, value in env.items():
                trace.env[key] = value

        return trace
예제 #18
0
def get_greatest_operative_mip_version(component_descriptors,
                                       log_level=bt2.LoggingLevel.NONE):
    utils._check_log_level(log_level)
    comp_descr_set_ptr = native_bt.component_descriptor_set_create()

    if comp_descr_set_ptr is None:
        raise bt2._MemoryError('cannot create component descriptor set object')

    if len(component_descriptors) == 0:
        raise ValueError('no component descriptors')

    try:
        for descr in component_descriptors:
            if type(descr) is not bt2.ComponentDescriptor:
                raise TypeError(
                    "'{}' is not a component descriptor".format(descr))

            base_cc_ptr = descr.component_class._bt_component_class_ptr()
            params_ptr = None

            if descr.params is not None:
                params_ptr = descr.params._ptr

            status = native_bt.bt2_component_descriptor_set_add_descriptor_with_initialize_method_data(
                comp_descr_set_ptr, base_cc_ptr, params_ptr, descr.obj)
            utils._handle_func_status(
                status, 'cannot add descriptor to component descriptor set')

        status, version = native_bt.get_greatest_operative_mip_version(
            comp_descr_set_ptr, log_level)

        if status == native_bt.__BT_FUNC_STATUS_NO_MATCH:
            return None

        utils._handle_func_status(status,
                                  'cannot get greatest operative MIP version')
        return version
    finally:
        native_bt.component_descriptor_set_put_ref(comp_descr_set_ptr)
예제 #19
0
파일: trace.py 프로젝트: tbricks/babeltrace
    def create_stream(self,
                      stream_class,
                      id=None,
                      name=None,
                      user_attributes=None):
        utils._check_type(stream_class, bt2_stream_class._StreamClass)

        if stream_class.assigns_automatic_stream_id:
            if id is not None:
                raise ValueError(
                    "id provided, but stream class assigns automatic stream ids"
                )

            stream_ptr = native_bt.stream_create(stream_class._ptr, self._ptr)
        else:
            if id is None:
                raise ValueError(
                    "id not provided, but stream class does not assign automatic stream ids"
                )

            utils._check_uint64(id)
            stream_ptr = native_bt.stream_create_with_id(
                stream_class._ptr, self._ptr, id)

        if stream_ptr is None:
            raise bt2._MemoryError('cannot create stream object')

        stream = bt2_stream._Stream._create_from_ptr(stream_ptr)

        if name is not None:
            stream._name = name

        if user_attributes is not None:
            stream._user_attributes = user_attributes

        return stream
예제 #20
0
 def _check_create_status(self, ptr):
     if ptr is None:
         raise bt2._MemoryError(
             'cannot create {} field class object'.format(self._NAME.lower())
         )
def _auto_discover_source_component_specs(auto_source_comp_specs, plugin_set):
    # Transform a list of `AutoSourceComponentSpec` in a list of `ComponentSpec`
    # using the automatic source discovery mechanism.
    inputs = bt2.ArrayValue([spec.input for spec in auto_source_comp_specs])

    if plugin_set is None:
        plugin_set = bt2.find_plugins()
    else:
        utils._check_type(plugin_set, bt2_plugin._PluginSet)

    res_ptr = native_bt.bt2_auto_discover_source_components(
        inputs._ptr, plugin_set._ptr)

    if res_ptr is None:
        raise bt2._MemoryError('cannot auto discover source components')

    res = bt2_value._create_from_ptr(res_ptr)

    assert type(res) == bt2.MapValue
    assert 'status' in res

    status = res['status']
    utils._handle_func_status(status, 'cannot auto-discover source components')

    comp_specs = []
    comp_specs_raw = res['results']
    assert type(comp_specs_raw) == bt2.ArrayValue

    used_input_indices = set()

    for comp_spec_raw in comp_specs_raw:
        assert type(comp_spec_raw) == bt2.ArrayValue
        assert len(comp_spec_raw) == 4

        plugin_name = comp_spec_raw[0]
        assert type(plugin_name) == bt2.StringValue
        plugin_name = str(plugin_name)

        class_name = comp_spec_raw[1]
        assert type(class_name) == bt2.StringValue
        class_name = str(class_name)

        comp_inputs = comp_spec_raw[2]
        assert type(comp_inputs) == bt2.ArrayValue

        comp_orig_indices = comp_spec_raw[3]
        assert type(comp_orig_indices)

        params = bt2.MapValue()
        logging_level = bt2.LoggingLevel.NONE
        obj = None

        # Compute `params` for this component by piling up params given to all
        # AutoSourceComponentSpec objects that contributed in the instantiation
        # of this component.
        #
        # The effective log level for a component is the last one specified
        # across the AutoSourceComponentSpec that contributed in its
        # instantiation.
        for idx in comp_orig_indices:
            orig_spec = auto_source_comp_specs[idx]

            if orig_spec.params is not None:
                params.update(orig_spec.params)

            if orig_spec.logging_level is not None:
                logging_level = orig_spec.logging_level

            if orig_spec.obj is not AutoSourceComponentSpec._no_obj:
                obj = orig_spec.obj

            used_input_indices.add(int(idx))

        params['inputs'] = comp_inputs

        comp_specs.append(
            ComponentSpec.from_named_plugin_and_component_class(
                plugin_name,
                class_name,
                params=params,
                obj=obj,
                logging_level=logging_level,
            ))

    if len(used_input_indices) != len(inputs):
        unused_input_indices = set(range(len(inputs))) - used_input_indices
        unused_input_indices = sorted(unused_input_indices)
        unused_inputs = [str(inputs[x]) for x in unused_input_indices]

        msg = (
            'Some auto source component specs did not produce any component: '
            + ', '.join(unused_inputs))
        raise RuntimeError(msg)

    return comp_specs
예제 #22
0
 def _check_create_status(self, ptr, type_name):
     if ptr is None:
         raise bt2._MemoryError(
             'cannot create {} field class'.format(type_name))