Skip to content

Commit

Permalink
lib, bt2: graph API: remove "ports connected" listeners
Browse files Browse the repository at this point in the history
Two ports being connected is always the consequence of the graph user
calling bt_graph_connect_ports() and this function returning
`BT_GRAPH_CONNECT_PORTS_STATUS_OK`. In other words, this event cannot
occur without a direct, concomitant action by the graph user.

Knowing this, the "ports connected" graph listeners are useless.

The "port added" listeners remain useful: a component can add a port at
many moments during the graph configuration phase, therefore having a
"port added" listener can avoid checking if the current graph components
have new ports every time you call bt_graph_add_*_component*() or
bt_graph_connect_ports().

This patch removes everything related to the "ports connected" graph
listeners.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Change-Id: I218c7b7b57c52f2e8589b35e3d89f38dfd961c0a
Reviewed-on: https://review.lttng.org/c/babeltrace/+/2636
Tested-by: jenkins <jenkins@lttng.org>
  • Loading branch information
eepp authored and jgalar committed Jan 20, 2020
1 parent ff3fcfe commit d9d764c
Show file tree
Hide file tree
Showing 8 changed files with 7 additions and 817 deletions.
28 changes: 0 additions & 28 deletions include/babeltrace2/graph/graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,34 +238,6 @@ bt_graph_add_filter_component_output_port_added_listener(
bt_graph_listener_removed_func listener_removed, void *data,
bt_listener_id *listener_id);

extern bt_graph_add_listener_status
bt_graph_add_source_filter_component_ports_connected_listener(
bt_graph *graph,
bt_graph_source_filter_component_ports_connected_listener_func listener,
bt_graph_listener_removed_func listener_removed, void *data,
bt_listener_id *listener_id);

extern bt_graph_add_listener_status
bt_graph_add_filter_filter_component_ports_connected_listener(
bt_graph *graph,
bt_graph_filter_filter_component_ports_connected_listener_func listener,
bt_graph_listener_removed_func listener_removed, void *data,
bt_listener_id *listener_id);

extern bt_graph_add_listener_status
bt_graph_add_source_sink_component_ports_connected_listener(
bt_graph *graph,
bt_graph_source_sink_component_ports_connected_listener_func listener,
bt_graph_listener_removed_func listener_removed, void *data,
bt_listener_id *listener_id);

extern bt_graph_add_listener_status
bt_graph_add_filter_sink_component_ports_connected_listener(
bt_graph *graph,
bt_graph_filter_sink_component_ports_connected_listener_func listener,
bt_graph_listener_removed_func listener_removed, void *data,
bt_listener_id *listener_id);

typedef enum bt_graph_add_interrupter_status {
BT_GRAPH_ADD_INTERRUPTER_STATUS_OK = __BT_FUNC_STATUS_OK,
BT_GRAPH_ADD_INTERRUPTER_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR,
Expand Down
39 changes: 0 additions & 39 deletions src/bindings/python/bt2/bt2/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,32 +40,6 @@ def _graph_port_added_listener_from_native(
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,
):
upstream_component = bt2_component._create_component_from_const_ptr_and_get_ref(
upstream_component_ptr, upstream_component_type
)
upstream_port = bt2_port._create_from_const_ptr_and_get_ref(
upstream_port_ptr, native_bt.PORT_TYPE_OUTPUT
)
downstream_component = bt2_component._create_component_from_const_ptr_and_get_ref(
downstream_component_ptr, downstream_component_type
)
downstream_port = bt2_port._create_from_const_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)
Expand Down Expand Up @@ -166,19 +140,6 @@ def add_port_added_listener(self, listener):
if listener_ids is None:
raise bt2._Error('cannot add listener to graph object')

def add_ports_connected_listener(self, listener):
if not callable(listener):
raise TypeError("'listener' parameter is not callable")

fn = native_bt.bt2_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:
raise bt2._Error('cannot add listener to graph object')

def run_once(self):
status = native_bt.graph_run_once(self._ptr)
utils._handle_func_status(status, 'graph object could not run once')
Expand Down
3 changes: 0 additions & 3 deletions src/bindings/python/bt2/bt2/native_bt_graph.i
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,6 @@
PyObject *bt_bt2_graph_add_port_added_listener(struct bt_graph *graph,
PyObject *py_callable);

PyObject *bt_bt2_graph_add_ports_connected_listener(struct bt_graph *graph,
PyObject *py_callable);

bt_graph_add_component_status
bt_bt2_graph_add_source_component(
bt_graph *graph,
Expand Down
265 changes: 0 additions & 265 deletions src/bindings/python/bt2/bt2/native_bt_graph.i.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,271 +247,6 @@ PyObject *bt_bt2_graph_add_port_added_listener(struct bt_graph *graph,
return py_listener_ids;
}

static
bt_graph_listener_func_status ports_connected_listener(
const void *upstream_component,
swig_type_info *upstream_component_swig_type,
bt_component_class_type upstream_component_class_type,
const bt_port_output *upstream_port,
const void *downstream_component,
swig_type_info *downstream_component_swig_type,
bt_component_class_type downstream_component_class_type,
const bt_port_input *downstream_port,
void *py_callable)
{
PyObject *py_upstream_component_ptr = NULL;
PyObject *py_upstream_port_ptr = NULL;
PyObject *py_downstream_component_ptr = NULL;
PyObject *py_downstream_port_ptr = NULL;
PyObject *py_res = NULL;
bt_graph_listener_func_status status;

py_upstream_component_ptr = SWIG_NewPointerObj(SWIG_as_voidptr(upstream_component),
upstream_component_swig_type, 0);
if (!py_upstream_component_ptr) {
BT_LOGF_STR("Failed to create upstream component SWIG pointer object.");
status = __BT_FUNC_STATUS_MEMORY_ERROR;
goto end;
}

py_upstream_port_ptr = SWIG_NewPointerObj(
SWIG_as_voidptr(upstream_port), SWIGTYPE_p_bt_port_output, 0);
if (!py_upstream_port_ptr) {
BT_LOGF_STR("Failed to create upstream port SWIG pointer object.");
status = __BT_FUNC_STATUS_MEMORY_ERROR;
goto end;
}

py_downstream_component_ptr = SWIG_NewPointerObj(SWIG_as_voidptr(downstream_component),
downstream_component_swig_type, 0);
if (!py_downstream_component_ptr) {
BT_LOGF_STR("Failed to create downstream component SWIG pointer object.");
status = __BT_FUNC_STATUS_MEMORY_ERROR;
goto end;
}

py_downstream_port_ptr = SWIG_NewPointerObj(
SWIG_as_voidptr(downstream_port), SWIGTYPE_p_bt_port_input, 0);
if (!py_downstream_port_ptr) {
BT_LOGF_STR("Failed to create downstream port SWIG pointer object.");
status = __BT_FUNC_STATUS_MEMORY_ERROR;
goto end;
}

py_res = PyObject_CallFunction(py_callable, "(OiOOiO)",
py_upstream_component_ptr, upstream_component_class_type,
py_upstream_port_ptr,
py_downstream_component_ptr, downstream_component_class_type,
py_downstream_port_ptr);
if (!py_res) {
loge_exception_append_cause_clear(
"Graph's port connected listener (Python)",
BT_LOG_OUTPUT_LEVEL);
status = __BT_FUNC_STATUS_ERROR;
goto end;
}

BT_ASSERT(py_res == Py_None);
status = __BT_FUNC_STATUS_OK;

end:
Py_XDECREF(py_upstream_component_ptr);
Py_XDECREF(py_upstream_port_ptr);
Py_XDECREF(py_downstream_component_ptr);
Py_XDECREF(py_downstream_port_ptr);
Py_XDECREF(py_res);
return status;
}

static
bt_graph_listener_func_status source_filter_component_ports_connected_listener(
const bt_component_source *source_component,
const bt_component_filter *filter_component,
const bt_port_output *upstream_port,
const bt_port_input *downstream_port, void *py_callable)
{
return ports_connected_listener(
source_component, SWIGTYPE_p_bt_component_source, BT_COMPONENT_CLASS_TYPE_SOURCE,
upstream_port,
filter_component, SWIGTYPE_p_bt_component_filter, BT_COMPONENT_CLASS_TYPE_FILTER,
downstream_port,
py_callable);
}

static
bt_graph_listener_func_status source_sink_component_ports_connected_listener(
const bt_component_source *source_component,
const bt_component_sink *sink_component,
const bt_port_output *upstream_port,
const bt_port_input *downstream_port, void *py_callable)
{
return ports_connected_listener(
source_component, SWIGTYPE_p_bt_component_source, BT_COMPONENT_CLASS_TYPE_SOURCE,
upstream_port,
sink_component, SWIGTYPE_p_bt_component_sink, BT_COMPONENT_CLASS_TYPE_SINK,
downstream_port,
py_callable);
}

static
bt_graph_listener_func_status filter_filter_component_ports_connected_listener(
const bt_component_filter *filter_component_left,
const bt_component_filter *filter_component_right,
const bt_port_output *upstream_port,
const bt_port_input *downstream_port, void *py_callable)
{
return ports_connected_listener(
filter_component_left, SWIGTYPE_p_bt_component_filter, BT_COMPONENT_CLASS_TYPE_FILTER,
upstream_port,
filter_component_right, SWIGTYPE_p_bt_component_filter, BT_COMPONENT_CLASS_TYPE_FILTER,
downstream_port,
py_callable);
}

static
bt_graph_listener_func_status filter_sink_component_ports_connected_listener(
const bt_component_filter *filter_component,
const bt_component_sink *sink_component,
const bt_port_output *upstream_port,
const bt_port_input *downstream_port, void *py_callable)
{
return ports_connected_listener(
filter_component, SWIGTYPE_p_bt_component_filter, BT_COMPONENT_CLASS_TYPE_FILTER,
upstream_port,
sink_component, SWIGTYPE_p_bt_component_sink, BT_COMPONENT_CLASS_TYPE_SINK,
downstream_port,
py_callable);
}

static
PyObject *bt_bt2_graph_add_ports_connected_listener(struct bt_graph *graph,
PyObject *py_callable)
{
PyObject *py_listener_ids = NULL;
PyObject *py_listener_id = NULL;
bt_listener_id listener_id;
bt_graph_add_listener_status status;
const char * const module_name =
"graph_add_ports_connected_listener() (Python)";

BT_ASSERT(graph);
BT_ASSERT(py_callable);

/* Behind the scene, we will be registering 4 different listeners and
* return all of their ids. */
py_listener_ids = PyTuple_New(4);
if (!py_listener_ids) {
BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(module_name,
"Failed to allocate one PyTuple.");
goto error;
}

/* source -> filter connection */
status = bt_graph_add_source_filter_component_ports_connected_listener(
graph, source_filter_component_ports_connected_listener,
graph_listener_removed, py_callable, &listener_id);
if (status != __BT_FUNC_STATUS_OK) {
/*
* bt_graph_add_source_filter_component_ports_connected_listener
* has already logged/appended an error cause.
*/
goto error;
}

py_listener_id = PyLong_FromUnsignedLongLong(listener_id);
if (!py_listener_id) {
BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(module_name,
"Failed to allocate one PyLong.");
goto error;
}

PyTuple_SET_ITEM(py_listener_ids, 0, py_listener_id);
py_listener_id = NULL;

/* source -> sink connection */
status = bt_graph_add_source_sink_component_ports_connected_listener(
graph, source_sink_component_ports_connected_listener,
graph_listener_removed, py_callable, &listener_id);
if (status != __BT_FUNC_STATUS_OK) {
/*
* bt_graph_add_source_sink_component_ports_connected_listener
* has already logged/appended an error cause.
*/
goto error;
}

py_listener_id = PyLong_FromUnsignedLongLong(listener_id);
if (!py_listener_id) {
BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(module_name,
"Failed to allocate one PyLong.");
goto error;
}

PyTuple_SET_ITEM(py_listener_ids, 1, py_listener_id);
py_listener_id = NULL;

/* filter -> filter connection */
status = bt_graph_add_filter_filter_component_ports_connected_listener(
graph, filter_filter_component_ports_connected_listener,
graph_listener_removed, py_callable, &listener_id);
if (status != __BT_FUNC_STATUS_OK) {
/*
* bt_graph_add_filter_filter_component_ports_connected_listener
* has already logged/appended an error cause.
*/
goto error;
}

py_listener_id = PyLong_FromUnsignedLongLong(listener_id);
if (!py_listener_id) {
BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(module_name,
"Failed to allocate one PyLong.");
goto error;
}

PyTuple_SET_ITEM(py_listener_ids, 2, py_listener_id);
py_listener_id = NULL;

/* filter -> sink connection */
status = bt_graph_add_filter_sink_component_ports_connected_listener(
graph, filter_sink_component_ports_connected_listener,
graph_listener_removed, py_callable, &listener_id);
if (status != __BT_FUNC_STATUS_OK) {
/*
* bt_graph_add_filter_sink_component_ports_connected_listener
* has already logged/appended an error cause.
*/
goto error;
}

py_listener_id = PyLong_FromUnsignedLongLong(listener_id);
if (!py_listener_id) {
BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_UNKNOWN(module_name,
"Failed to allocate one PyLong.");
goto error;
}

PyTuple_SET_ITEM(py_listener_ids, 3, py_listener_id);
py_listener_id = NULL;

Py_INCREF(py_callable);
Py_INCREF(py_callable);
Py_INCREF(py_callable);
Py_INCREF(py_callable);

goto end;

error:
Py_XDECREF(py_listener_ids);
py_listener_ids = Py_None;
Py_INCREF(py_listener_ids);

end:

Py_XDECREF(py_listener_id);
return py_listener_ids;
}

static
bt_graph_add_component_status
bt_bt2_graph_add_source_component(
Expand Down
Loading

0 comments on commit d9d764c

Please sign in to comment.