tap-driver.sh: flush stdout after each test result
[babeltrace.git] / bindings / python / bt2 / bt2 / graph.py
index 56148395deafdea4d657896a7605f586febdf83a..998d310b3b268ea8d6640b5a6a06fe2180ee7a52 100644 (file)
@@ -28,65 +28,34 @@ import bt2.port
 import bt2
 
 
-class GraphListenerType:
-    PORT_ADDED = 0
-    PORT_REMOVED = 1
-    PORTS_CONNECTED = 2
-    PORTS_DISCONNECTED = 3
-
-
-def _graph_port_added_listener_from_native(user_listener, port_ptr):
-    try:
-        port = bt2.port._create_from_ptr(port_ptr)
-        port._get()
-        user_listener(port)
-    except:
-        pass
-
-
-def _graph_port_removed_listener_from_native(user_listener, port_ptr):
-    try:
-        port = bt2.port._create_from_ptr(port_ptr)
-        port._get()
-        user_listener(port)
-    except:
-        pass
+def _graph_port_added_listener_from_native(user_listener,
+                                           component_ptr, component_type,
+                                           port_ptr, port_type):
+    component = bt2.component._create_component_from_ptr_and_get_ref(component_ptr, component_type)
+    port = bt2.port._create_from_ptr_and_get_ref(port_ptr, port_type)
+    user_listener(component, port)
 
 
 def _graph_ports_connected_listener_from_native(user_listener,
+                                                upstream_component_ptr, upstream_component_type,
                                                 upstream_port_ptr,
+                                                downstream_component_ptr, downstream_component_type,
                                                 downstream_port_ptr):
-    try:
-        upstream_port = bt2.port._create_from_ptr(upstream_port_ptr)
-        upstream_port._get()
-        downstream_port = bt2.port._create_from_ptr(downstream_port_ptr)
-        downstream_port._get()
-        user_listener(upstream_port, downstream_port)
-    except:
-        pass
-
-
-def _graph_ports_disconnected_listener_from_native(user_listener,
-                                                   upstream_comp_ptr,
-                                                   downstream_comp_ptr,
-                                                   upstream_port_ptr,
-                                                   downstream_port_ptr):
-    try:
-        upstream_comp = bt2.component._create_generic_component_from_ptr(upstream_comp_ptr)
-        upstream_comp._get()
-        downstream_comp = bt2.component._create_generic_component_from_ptr(downstream_comp_ptr)
-        downstream_comp._get()
-        upstream_port = bt2.port._create_from_ptr(upstream_port_ptr)
-        upstream_port._get()
-        downstream_port = bt2.port._create_from_ptr(downstream_port_ptr)
-        downstream_port._get()
-        user_listener(upstream_comp, downstream_comp, upstream_port,
-                      downstream_port)
-    except:
-        pass
-
-
-class Graph(object._Object):
+    upstream_component = bt2.component._create_component_from_ptr_and_get_ref(
+        upstream_component_ptr, upstream_component_type)
+    upstream_port = bt2.port._create_from_ptr_and_get_ref(
+        upstream_port_ptr, native_bt.PORT_TYPE_OUTPUT)
+    downstream_component = bt2.component._create_component_from_ptr_and_get_ref(
+        downstream_component_ptr, downstream_component_type)
+    downstream_port = bt2.port._create_from_ptr_and_get_ref(
+        downstream_port_ptr, native_bt.PORT_TYPE_INPUT)
+    user_listener(upstream_component, upstream_port, downstream_component, downstream_port)
+
+
+class Graph(object._SharedObject):
+    _get_ref = staticmethod(native_bt.graph_get_ref)
+    _put_ref = staticmethod(native_bt.graph_put_ref)
+
     def __init__(self):
         ptr = native_bt.graph_create()
 
@@ -104,32 +73,47 @@ class Graph(object._Object):
             raise bt2.Stop
         elif status == native_bt.GRAPH_STATUS_AGAIN:
             raise bt2.TryAgain
-        elif status == native_bt.GRAPH_STATUS_NO_SINK:
-            raise bt2.NoSinkComponent
         elif status < 0:
             raise bt2.Error(gen_error_msg)
 
     def add_component(self, component_class, name, params=None):
-        if isinstance(component_class, bt2.component._GenericComponentClass):
+        if isinstance(component_class, bt2.component._GenericSourceComponentClass):
+            cc_ptr = component_class._ptr
+            add_fn = native_bt.graph_add_source_component
+            cc_type = native_bt.COMPONENT_CLASS_TYPE_SOURCE
+        elif isinstance(component_class, bt2.component._GenericFilterComponentClass):
+            cc_ptr = component_class._ptr
+            add_fn = native_bt.graph_add_filter_component
+            cc_type = native_bt.COMPONENT_CLASS_TYPE_FILTER
+        elif isinstance(component_class, bt2.component._GenericSinkComponentClass):
             cc_ptr = component_class._ptr
-        elif issubclass(component_class, bt2.component._UserComponent):
+            add_fn = native_bt.graph_add_sink_component
+            cc_type = native_bt.COMPONENT_CLASS_TYPE_SINK
+        elif issubclass(component_class, bt2.component._UserSourceComponent):
             cc_ptr = component_class._cc_ptr
+            add_fn = native_bt.graph_add_source_component
+            cc_type = native_bt.COMPONENT_CLASS_TYPE_SOURCE
+        elif issubclass(component_class, bt2.component._UserSinkComponent):
+            cc_ptr = component_class._cc_ptr
+            add_fn = native_bt.graph_add_sink_component
+            cc_type = native_bt.COMPONENT_CLASS_TYPE_SINK
+        elif issubclass(component_class, bt2.component._UserFilterComponent):
+            cc_ptr = component_class._cc_ptr
+            add_fn = native_bt.graph_add_filter_component
+            cc_type = native_bt.COMPONENT_CLASS_TYPE_FILTER
         else:
-            raise TypeError("'{}' is not a component class".format(component_class.__class__.__name__))
+            raise TypeError("'{}' is not a component class".format(
+                component_class.__class__.__name__))
 
         utils._check_str(name)
         params = bt2.create_value(params)
 
-        if params is None:
-            params_ptr = None
-        else:
-            params_ptr = params._ptr
+        params_ptr = params._ptr if params is not None else None
 
-        status, comp_ptr = native_bt.graph_add_component(self._ptr, cc_ptr,
-                                                         name, params_ptr)
+        status, comp_ptr = add_fn(self._ptr, cc_ptr, name, params_ptr)
         self._handle_status(status, 'cannot add component to graph')
-        assert(comp_ptr)
-        return bt2.component._create_generic_component_from_ptr(comp_ptr)
+        assert comp_ptr
+        return bt2.component._create_component_from_ptr(comp_ptr, cc_type)
 
     def connect_ports(self, upstream_port, downstream_port):
         utils._check_type(upstream_port, bt2.port._OutputPort)
@@ -141,32 +125,31 @@ class Graph(object._Object):
         assert(conn_ptr)
         return bt2.connection._Connection._create_from_ptr(conn_ptr)
 
-    def add_listener(self, listener_type, listener):
-        if not hasattr(listener, '__call__'):
+    def add_port_added_listener(self, listener):
+        if not callable(listener):
             raise TypeError("'listener' parameter is not callable")
 
-        if listener_type == GraphListenerType.PORT_ADDED:
-            fn = native_bt.py3_graph_add_port_added_listener
-            listener_from_native = functools.partial(_graph_port_added_listener_from_native,
-                                                     listener)
-        elif listener_type == GraphListenerType.PORT_REMOVED:
-            fn = native_bt.py3_graph_add_port_removed_listener
-            listener_from_native = functools.partial(_graph_port_removed_listener_from_native,
-                                                     listener)
-        elif listener_type == GraphListenerType.PORTS_CONNECTED:
-            fn = native_bt.py3_graph_add_ports_connected_listener
-            listener_from_native = functools.partial(_graph_ports_connected_listener_from_native,
-                                                     listener)
-        elif listener_type == GraphListenerType.PORTS_DISCONNECTED:
-            fn = native_bt.py3_graph_add_ports_disconnected_listener
-            listener_from_native = functools.partial(_graph_ports_disconnected_listener_from_native,
-                                                     listener)
-        else:
-            raise TypeError
+        fn = native_bt.py3_graph_add_port_added_listener
+        listener_from_native = functools.partial(_graph_port_added_listener_from_native,
+                                                 listener)
 
-        listener_id = fn(self._ptr, listener_from_native)
-        utils._handle_ret(listener_id, 'cannot add listener to graph object')
-        return bt2._ListenerHandle(listener_id, self)
+        listener_ids = fn(self._ptr, listener_from_native)
+        if listener_ids is None:
+            utils._raise_bt2_error('cannot add listener to graph object')
+        return bt2._ListenerHandle(listener_ids, self)
+
+    def add_ports_connected_listener(self, listener):
+        if not callable(listener):
+            raise TypeError("'listener' parameter is not callable")
+
+        fn = native_bt.py3_graph_add_ports_connected_listener
+        listener_from_native = functools.partial(_graph_ports_connected_listener_from_native,
+                                                 listener)
+
+        listener_ids = fn(self._ptr, listener_from_native)
+        if listener_ids is None:
+            utils._raise_bt2_error('cannot add listener to graph object')
+        return bt2._ListenerHandle(listener_ids, self)
 
     def run(self):
         status = native_bt.graph_run(self._ptr)
@@ -186,8 +169,11 @@ class Graph(object._Object):
         assert(is_canceled >= 0)
         return is_canceled > 0
 
-    def __eq__(self, other):
-        if type(other) is not type(self):
-            return False
+    def create_output_port_message_iterator(self, output_port):
+        utils._check_type(output_port, bt2.port._OutputPort)
+        msg_iter_ptr = native_bt.port_output_message_iterator_create(self._ptr, output_port._ptr)
+
+        if msg_iter_ptr is None:
+            raise bt2.CreationError('cannot create output port message iterator')
 
-        return self.addr == other.addr
+        return bt2.message_iterator._OutputPortMessageIterator(msg_iter_ptr)
This page took 0.025995 seconds and 4 git commands to generate.