X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fgraph.c;h=747a282601d5622543139a683b15e62572db9515;hb=8cc092c9277ed3efaf0523e5c7585cec6c332353;hp=e7f8db3f3e76f3b5c3e0f9b18a724a06ba6b00cd;hpb=8480c8cc7e985169ab42060d3cd3c72d6c8d240d;p=babeltrace.git diff --git a/lib/graph/graph.c b/lib/graph/graph.c index e7f8db3f..747a2826 100644 --- a/lib/graph/graph.c +++ b/lib/graph/graph.c @@ -44,9 +44,42 @@ struct bt_graph_listener { void *func; + bt_graph_listener_removed removed; void *data; }; +static +int init_listeners_array(GArray **listeners) +{ + int ret = 0; + + assert(listeners); + *listeners = g_array_new(FALSE, TRUE, sizeof(struct bt_graph_listener)); + if (!*listeners) { + BT_LOGE_STR("Failed to allocate one GArray."); + ret = -1; + goto end; + } + +end: + return ret; +} + +static +void call_remove_listeners(GArray *listeners) +{ + size_t i; + + for (i = 0; i < listeners->len; i++) { + struct bt_graph_listener listener = + g_array_index(listeners, struct bt_graph_listener, i); + + if (listener.removed) { + listener.removed(listener.data); + } + } +} + static void bt_graph_destroy(struct bt_object *obj) { @@ -88,6 +121,12 @@ void bt_graph_destroy(struct bt_object *obj) */ (void) bt_graph_cancel(graph); + /* Call all remove listeners */ + call_remove_listeners(graph->listeners.port_added); + call_remove_listeners(graph->listeners.port_removed); + call_remove_listeners(graph->listeners.ports_connected); + call_remove_listeners(graph->listeners.ports_disconnected); + if (graph->connections) { BT_LOGD_STR("Destroying connections."); g_ptr_array_free(graph->connections, TRUE); @@ -119,23 +158,6 @@ void bt_graph_destroy(struct bt_object *obj) g_free(graph); } -static -int init_listeners_array(GArray **listeners) -{ - int ret = 0; - - assert(listeners); - *listeners = g_array_new(FALSE, TRUE, sizeof(struct bt_graph_listener)); - if (!*listeners) { - BT_LOGE_STR("Failed to allocate one GArray."); - ret = -1; - goto end; - } - -end: - return ret; -} - struct bt_graph *bt_graph_create(void) { struct bt_graph *graph; @@ -530,10 +552,11 @@ end: } static -int add_listener(GArray *listeners, void *func, void *data) +int add_listener(GArray *listeners, void *func, void *removed, void *data) { struct bt_graph_listener listener = { .func = func, + .removed = removed, .data = data, }; @@ -543,7 +566,8 @@ int add_listener(GArray *listeners, void *func, void *data) int bt_graph_add_port_added_listener( struct bt_graph *graph, - bt_graph_port_added_listener listener, void *data) + bt_graph_port_added_listener listener, + bt_graph_listener_removed listener_removed, void *data) { int ret; @@ -553,13 +577,21 @@ int bt_graph_add_port_added_listener( goto end; } + if (graph->in_remove_listener) { + BT_LOGW("Cannot call this function during the execution of a remove listener: " + "addr=%p", graph); + ret = -1; + goto end; + } + if (!listener) { BT_LOGW_STR("Invalid parameter: listener is NULL."); ret = -1; goto end; } - ret = add_listener(graph->listeners.port_added, listener, data); + ret = add_listener(graph->listeners.port_added, listener, + listener_removed, data); BT_LOGV("Added \"port added\" listener to graph: " "graph-addr=%p, listener-addr=%p, pos=%d", graph, listener, ret); @@ -570,7 +602,8 @@ end: int bt_graph_add_port_removed_listener( struct bt_graph *graph, - bt_graph_port_removed_listener listener, void *data) + bt_graph_port_removed_listener listener, + bt_graph_listener_removed listener_removed, void *data) { int ret; @@ -580,13 +613,21 @@ int bt_graph_add_port_removed_listener( goto end; } + if (graph->in_remove_listener) { + BT_LOGW("Cannot call this function during the execution of a remove listener: " + "addr=%p", graph); + ret = -1; + goto end; + } + if (!listener) { BT_LOGW_STR("Invalid parameter: listener is NULL."); ret = -1; goto end; } - ret = add_listener(graph->listeners.port_removed, listener, data); + ret = add_listener(graph->listeners.port_removed, listener, + listener_removed, data); BT_LOGV("Added \"port removed\" listener to graph: " "graph-addr=%p, listener-addr=%p, pos=%d", graph, listener, ret); @@ -597,7 +638,8 @@ end: int bt_graph_add_ports_connected_listener( struct bt_graph *graph, - bt_graph_ports_connected_listener listener, void *data) + bt_graph_ports_connected_listener listener, + bt_graph_listener_removed listener_removed, void *data) { int ret; @@ -607,13 +649,21 @@ int bt_graph_add_ports_connected_listener( goto end; } + if (graph->in_remove_listener) { + BT_LOGW("Cannot call this function during the execution of a remove listener: " + "addr=%p", graph); + ret = -1; + goto end; + } + if (!listener) { BT_LOGW_STR("Invalid parameter: listener is NULL."); ret = -1; goto end; } - ret = add_listener(graph->listeners.ports_connected, listener, data); + ret = add_listener(graph->listeners.ports_connected, listener, + listener_removed, data); BT_LOGV("Added \"port connected\" listener to graph: " "graph-addr=%p, listener-addr=%p, pos=%d", graph, listener, ret); @@ -624,7 +674,8 @@ end: int bt_graph_add_ports_disconnected_listener( struct bt_graph *graph, - bt_graph_ports_disconnected_listener listener, void *data) + bt_graph_ports_disconnected_listener listener, + bt_graph_listener_removed listener_removed, void *data) { int ret; @@ -634,13 +685,21 @@ int bt_graph_add_ports_disconnected_listener( goto end; } + if (graph->in_remove_listener) { + BT_LOGW("Cannot call this function during the execution of a remove listener: " + "addr=%p", graph); + ret = -1; + goto end; + } + if (!listener) { BT_LOGW_STR("Invalid parameter: listener is NULL."); ret = -1; goto end; } - ret = add_listener(graph->listeners.ports_disconnected, listener, data); + ret = add_listener(graph->listeners.ports_disconnected, listener, + listener_removed, data); BT_LOGV("Added \"port disconnected\" listener to graph: " "graph-addr=%p, listener-addr=%p, pos=%d", graph, listener, ret);