/*
+ * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
* Copyright 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
- * Copyright 2017 Philippe Proulx <pproulx@efficios.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
#define BT_LOG_TAG "GRAPH"
#include <babeltrace/lib-logging-internal.h>
+#include <babeltrace/assert-internal.h>
+#include <babeltrace/assert-pre-internal.h>
#include <babeltrace/graph/component-internal.h>
-#include <babeltrace/graph/private-graph.h>
+#include <babeltrace/graph/graph.h>
+#include <babeltrace/graph/graph-const.h>
#include <babeltrace/graph/graph-internal.h>
#include <babeltrace/graph/connection-internal.h>
#include <babeltrace/graph/component-sink-internal.h>
-#include <babeltrace/graph/component-source.h>
-#include <babeltrace/graph/component-filter.h>
-#include <babeltrace/graph/port.h>
-#include <babeltrace/graph/notification-internal.h>
-#include <babeltrace/graph/notification-event-internal.h>
-#include <babeltrace/graph/notification-packet-internal.h>
+#include <babeltrace/graph/component-source-const.h>
+#include <babeltrace/graph/component-filter-const.h>
+#include <babeltrace/graph/port-const.h>
+#include <babeltrace/graph/message-internal.h>
+#include <babeltrace/graph/message-event-internal.h>
+#include <babeltrace/graph/message-packet-internal.h>
#include <babeltrace/compiler-internal.h>
#include <babeltrace/common-internal.h>
#include <babeltrace/types.h>
-#include <babeltrace/values.h>
-#include <babeltrace/private-values.h>
-#include <babeltrace/values-internal.h>
-#include <babeltrace/object.h>
-#include <babeltrace/assert-internal.h>
-#include <babeltrace/assert-pre-internal.h>
+#include <babeltrace/value.h>
+#include <babeltrace/value-const.h>
+#include <babeltrace/value-internal.h>
#include <unistd.h>
#include <glib.h>
-typedef void (*port_added_func_t)(void *, void *, void *);
-typedef void (*port_removed_func_t)(void *, void *, void *);
-typedef void (*ports_connected_func_t)(void *, void *, void *, void *, void *);
-typedef void (*ports_disconnected_func_t)(void *, void *, void *, void *, void *);
-typedef enum bt_self_component_status (*comp_init_method_t)(void *, void *, void *);
+typedef void (*port_added_func_t)(const void *, const void *, void *);
+
+typedef void (*port_removed_func_t)(const void *, const void *, void *);
+
+typedef void (*ports_connected_func_t)(const void *, const void *, const void *,
+ const void *, void *);
+
+typedef void (*ports_disconnected_func_t)(const void *, const void *,
+ const void *, const void *, void *);
+
+typedef enum bt_self_component_status (*comp_init_method_t)(const void *,
+ const void *, void *);
struct bt_graph_listener {
- bt_private_graph_listener_removed removed;
+ bt_graph_listener_removed_func removed;
void *data;
};
static
void destroy_graph(struct bt_object *obj)
{
- struct bt_graph *graph = container_of(obj,
- struct bt_graph, base);
+ struct bt_graph *graph = container_of(obj, struct bt_graph, base);
/*
* The graph's reference count is 0 if we're here. Increment
*
* 1. We put and destroy a connection.
* 2. This connection's destructor finalizes its active
- * notification iterators.
- * 3. A notification iterator's finalization function gets a
+ * message iterators.
+ * 3. A message iterator's finalization function gets a
* new reference on its component (reference count goes from
* 0 to 1).
* 4. Since this component's reference count goes to 1, it takes
* a reference on its parent (this graph). This graph's
* reference count goes from 0 to 1.
- * 5. The notification iterator's finalization function puts its
+ * 5. The message iterator's finalization function puts its
* component reference (reference count goes from 1 to 0).
* 6. Since this component's reference count goes from 1 to 0,
* it puts its parent (this graph). This graph's reference
/*
* Cancel the graph to disallow some operations, like creating
- * notification iterators and adding ports to components.
+ * message iterators and adding ports to components.
*/
- (void) bt_private_graph_cancel((void *) graph);
+ (void) bt_graph_cancel((void *) graph);
/* Call all remove listeners */
CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_added,
graph->listeners.sink_input_port_removed);
CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
graph->listeners.source_filter_ports_connected);
+ CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
+ graph->listeners.filter_filter_ports_connected);
CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
graph->listeners.source_sink_ports_connected);
CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
graph->listeners.filter_sink_ports_connected);
CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
graph->listeners.source_filter_ports_disconnected);
+ CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
+ graph->listeners.filter_filter_ports_disconnected);
CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
graph->listeners.source_sink_ports_disconnected);
CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
graph->listeners.filter_sink_ports_disconnected);
- if (graph->notifications) {
- g_ptr_array_free(graph->notifications, TRUE);
- graph->notifications = NULL;
+ if (graph->messages) {
+ g_ptr_array_free(graph->messages, TRUE);
+ graph->messages = NULL;
}
if (graph->connections) {
graph->listeners.source_filter_ports_connected = NULL;
}
+ if (graph->listeners.filter_filter_ports_connected) {
+ g_array_free(graph->listeners.filter_filter_ports_connected,
+ TRUE);
+ graph->listeners.filter_filter_ports_connected = NULL;
+ }
+
if (graph->listeners.source_sink_ports_connected) {
g_array_free(graph->listeners.source_sink_ports_connected,
TRUE);
graph->listeners.source_sink_ports_disconnected = NULL;
}
+ if (graph->listeners.filter_filter_ports_disconnected) {
+ g_array_free(graph->listeners.filter_filter_ports_disconnected,
+ TRUE);
+ graph->listeners.filter_filter_ports_disconnected = NULL;
+ }
+
if (graph->listeners.filter_sink_ports_disconnected) {
g_array_free(graph->listeners.filter_sink_ports_disconnected,
TRUE);
graph->listeners.filter_sink_ports_disconnected = NULL;
}
- bt_object_pool_finalize(&graph->event_notif_pool);
- bt_object_pool_finalize(&graph->packet_begin_notif_pool);
- bt_object_pool_finalize(&graph->packet_end_notif_pool);
+ bt_object_pool_finalize(&graph->event_msg_pool);
+ bt_object_pool_finalize(&graph->packet_begin_msg_pool);
+ bt_object_pool_finalize(&graph->packet_end_msg_pool);
g_free(graph);
}
static
-void destroy_notification_event(struct bt_notification *notif,
+void destroy_message_event(struct bt_message *msg,
struct bt_graph *graph)
{
- bt_notification_event_destroy(notif);
+ bt_message_event_destroy(msg);
}
static
-void destroy_notification_packet_begin(struct bt_notification *notif,
+void destroy_message_packet_begin(struct bt_message *msg,
struct bt_graph *graph)
{
- bt_notification_packet_begin_destroy(notif);
+ bt_message_packet_beginning_destroy(msg);
}
static
-void destroy_notification_packet_end(struct bt_notification *notif,
+void destroy_message_packet_end(struct bt_message *msg,
struct bt_graph *graph)
{
- bt_notification_packet_end_destroy(notif);
+ bt_message_packet_end_destroy(msg);
}
static
-void notify_notification_graph_is_destroyed(struct bt_notification *notif)
+void notify_message_graph_is_destroyed(struct bt_message *msg)
{
- bt_notification_unlink_graph(notif);
+ bt_message_unlink_graph(msg);
}
-struct bt_private_graph *bt_private_graph_create(void)
+struct bt_graph *bt_graph_create(void)
{
struct bt_graph *graph;
int ret;
goto error;
}
+ INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_connected,
+ graph->listeners.filter_filter_ports_connected);
+
+ if (!graph->listeners.filter_filter_ports_connected) {
+ ret = -1;
+ goto error;
+ }
+
INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_connected,
graph->listeners.filter_sink_ports_connected);
goto error;
}
+ INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_disconnected,
+ graph->listeners.filter_filter_ports_disconnected);
+
+ if (!graph->listeners.filter_filter_ports_disconnected) {
+ ret = -1;
+ goto error;
+ }
+
INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_disconnected,
graph->listeners.filter_sink_ports_disconnected);
goto error;
}
- ret = bt_object_pool_initialize(&graph->event_notif_pool,
- (bt_object_pool_new_object_func) bt_notification_event_new,
- (bt_object_pool_destroy_object_func) destroy_notification_event,
+ ret = bt_object_pool_initialize(&graph->event_msg_pool,
+ (bt_object_pool_new_object_func) bt_message_event_new,
+ (bt_object_pool_destroy_object_func) destroy_message_event,
graph);
if (ret) {
- BT_LOGE("Failed to initialize event notification pool: ret=%d",
+ BT_LOGE("Failed to initialize event message pool: ret=%d",
ret);
goto error;
}
- ret = bt_object_pool_initialize(&graph->packet_begin_notif_pool,
- (bt_object_pool_new_object_func) bt_notification_packet_begin_new,
- (bt_object_pool_destroy_object_func) destroy_notification_packet_begin,
+ ret = bt_object_pool_initialize(&graph->packet_begin_msg_pool,
+ (bt_object_pool_new_object_func) bt_message_packet_beginning_new,
+ (bt_object_pool_destroy_object_func) destroy_message_packet_begin,
graph);
if (ret) {
- BT_LOGE("Failed to initialize packet beginning notification pool: ret=%d",
+ BT_LOGE("Failed to initialize packet beginning message pool: ret=%d",
ret);
goto error;
}
- ret = bt_object_pool_initialize(&graph->packet_end_notif_pool,
- (bt_object_pool_new_object_func) bt_notification_packet_end_new,
- (bt_object_pool_destroy_object_func) destroy_notification_packet_end,
+ ret = bt_object_pool_initialize(&graph->packet_end_msg_pool,
+ (bt_object_pool_new_object_func) bt_message_packet_end_new,
+ (bt_object_pool_destroy_object_func) destroy_message_packet_end,
graph);
if (ret) {
- BT_LOGE("Failed to initialize packet end notification pool: ret=%d",
+ BT_LOGE("Failed to initialize packet end message pool: ret=%d",
ret);
goto error;
}
- graph->notifications = g_ptr_array_new_with_free_func(
- (GDestroyNotify) notify_notification_graph_is_destroyed);
+ graph->messages = g_ptr_array_new_with_free_func(
+ (GDestroyNotify) notify_message_graph_is_destroyed);
BT_LIB_LOGD("Created graph object: %!+g", graph);
end:
goto end;
}
-enum bt_graph_status bt_private_graph_connect_ports(
- struct bt_private_graph *priv_graph,
- struct bt_port_output *upstream_port_out,
- struct bt_port_input *downstream_port_in,
- struct bt_connection **user_connection)
+enum bt_graph_status bt_graph_connect_ports(
+ struct bt_graph *graph,
+ const struct bt_port_output *upstream_port_out,
+ const struct bt_port_input *downstream_port_in,
+ const struct bt_connection **user_connection)
{
- struct bt_graph *graph = (void *) priv_graph;
enum bt_graph_status status = BT_GRAPH_STATUS_OK;
struct bt_connection *connection = NULL;
struct bt_port *upstream_port = (void *) upstream_port_out;
"Upstream port is already connected: %!+p", upstream_port);
BT_ASSERT_PRE(!bt_port_is_connected(downstream_port),
"Downstream port is already connected: %!+p", downstream_port);
- BT_ASSERT_PRE(bt_port_borrow_component((void *) upstream_port),
+ BT_ASSERT_PRE(bt_port_borrow_component_inline((void *) upstream_port),
"Upstream port does not belong to a component: %!+p",
upstream_port);
- BT_ASSERT_PRE(bt_port_borrow_component((void *) downstream_port),
+ BT_ASSERT_PRE(bt_port_borrow_component_inline((void *) downstream_port),
"Downstream port does not belong to a component: %!+p",
downstream_port);
init_can_consume = graph->can_consume;
"%![graph-]+g, %![up-port-]+p, %![down-port-]+p",
graph, upstream_port, downstream_port);
bt_graph_set_can_consume(graph, false);
- upstream_component = bt_port_borrow_component(
+ upstream_component = bt_port_borrow_component_inline(
(void *) upstream_port);
- downstream_component = bt_port_borrow_component(
+ downstream_component = bt_port_borrow_component_inline(
(void *) downstream_port);
/*
goto end;
}
- connection->notified_upstream_port_connected = true;
+ connection->msgied_upstream_port_connected = true;
BT_LIB_LOGD("Notifying downstream component that its port is connected: "
"%![comp-]+c, %![port-]+p", downstream_component,
downstream_port);
goto end;
}
- connection->notified_downstream_port_connected = true;
+ connection->msgied_downstream_port_connected = true;
/*
* Notify the graph's creator that both ports are connected.
*/
BT_LOGD_STR("Notifying graph's user that new component ports are connected.");
bt_graph_notify_ports_connected(graph, upstream_port, downstream_port);
- connection->notified_graph_ports_connected = true;
+ connection->msgied_graph_ports_connected = true;
BT_LIB_LOGD("Connected component ports within graph: "
"%![graph-]+g, %![up-comp-]+c, %![down-comp-]+c, "
"%![up-port-]+p, %![down-port-]+p",
return status;
}
-enum bt_graph_status bt_private_graph_consume(
- struct bt_private_graph *priv_graph)
+enum bt_graph_status bt_graph_consume(
+ struct bt_graph *graph)
{
- struct bt_graph *graph = (void *) priv_graph;
enum bt_graph_status status;
BT_ASSERT_PRE_NON_NULL(graph, "Graph");
return status;
}
-enum bt_graph_status bt_private_graph_run(struct bt_private_graph *priv_graph)
+enum bt_graph_status bt_graph_run(struct bt_graph *graph)
{
- struct bt_graph *graph = (void *) priv_graph;
enum bt_graph_status status = BT_GRAPH_STATUS_OK;
BT_ASSERT_PRE_NON_NULL(graph, "Graph");
*
* However, in the case where a single sink is
* left, the caller can decide to busy-wait and
- * call bt_private_graph_run() continuously
+ * call bt_graph_run() continuously
* until the source is ready or it can decide to
* sleep for an arbitrary amount of time.
*/
}
enum bt_graph_status
-bt_private_graph_add_source_component_output_port_added_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_source_component_output_port_added_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_component_output_port_added_listener(
+ struct bt_graph *graph,
+ bt_graph_source_component_output_port_added_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_added listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_filter_component_output_port_added_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_filter_component_output_port_added_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_component_output_port_added_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_component_output_port_added_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_added listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_filter_component_input_port_added_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_filter_component_input_port_added_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_component_input_port_added_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_component_input_port_added_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_added listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_sink_component_input_port_added_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_sink_component_input_port_added_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_sink_component_input_port_added_listener(
+ struct bt_graph *graph,
+ bt_graph_sink_component_input_port_added_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_added listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_source_component_output_port_removed_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_source_component_output_port_removed_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_component_output_port_removed_listener(
+ struct bt_graph *graph,
+ bt_graph_source_component_output_port_removed_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_removed listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_filter_component_output_port_removed_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_filter_component_output_port_removed_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_component_output_port_removed_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_component_output_port_removed_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_removed listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_filter_component_input_port_removed_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_filter_component_input_port_removed_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_component_input_port_removed_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_component_input_port_removed_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_removed listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_sink_component_input_port_removed_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_sink_component_input_port_removed_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_sink_component_input_port_removed_listener(
+ struct bt_graph *graph,
+ bt_graph_sink_component_input_port_removed_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_port_removed listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_source_filter_component_ports_connected_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_source_filter_component_ports_connected_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_filter_component_ports_connected_listener(
+ struct bt_graph *graph,
+ bt_graph_source_filter_component_ports_connected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_ports_connected listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_source_sink_component_ports_connected_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_source_sink_component_ports_connected_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_sink_component_ports_connected_listener(
+ struct bt_graph *graph,
+ bt_graph_source_sink_component_ports_connected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_ports_connected listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_filter_sink_component_ports_connected_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_filter_sink_component_ports_connected_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_filter_component_ports_connected_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_filter_component_ports_connected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
+ int *out_listener_id)
+{
+ struct bt_graph_listener_ports_connected listener = {
+ .base = {
+ .removed = listener_removed,
+ .data = data,
+ },
+ .func = (ports_connected_func_t) func,
+ };
+ int listener_id;
+
+ BT_ASSERT_PRE_NON_NULL(graph, "Graph");
+ BT_ASSERT_PRE_NON_NULL(func, "Listener");
+ BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
+ BT_ASSERT_PRE(!graph->in_remove_listener,
+ "Graph currently executing a \"listener removed\" listener: "
+ "%!+g", graph);
+ g_array_append_val(graph->listeners.filter_filter_ports_connected,
+ listener);
+ listener_id = graph->listeners.filter_filter_ports_connected->len - 1;
+ BT_LIB_LOGV("Added \"filter to filter component ports connected\" listener to graph: "
+ "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
+ listener_id);
+
+ if (listener_id) {
+ *out_listener_id = listener_id;
+ }
+
+ return BT_GRAPH_STATUS_OK;
+}
+
+enum bt_graph_status
+bt_graph_add_filter_sink_component_ports_connected_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_sink_component_ports_connected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_ports_connected listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_source_filter_component_ports_disconnected_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_source_filter_component_ports_disconnected_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_filter_component_ports_disconnected_listener(
+ struct bt_graph *graph,
+ bt_graph_source_filter_component_ports_disconnected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_ports_disconnected listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_source_sink_component_ports_disconnected_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_source_sink_component_ports_disconnected_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_sink_component_ports_disconnected_listener(
+ struct bt_graph *graph,
+ bt_graph_source_sink_component_ports_disconnected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_ports_disconnected listener = {
.base = {
.removed = listener_removed,
}
enum bt_graph_status
-bt_private_graph_add_filter_sink_component_ports_disconnected_listener(
- struct bt_private_graph *priv_graph,
- bt_private_graph_filter_sink_component_ports_disconnected_listener func,
- bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_filter_component_ports_disconnected_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_filter_component_ports_disconnected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
+ int *out_listener_id)
+{
+ struct bt_graph_listener_ports_disconnected listener = {
+ .base = {
+ .removed = listener_removed,
+ .data = data,
+ },
+ .func = (ports_disconnected_func_t) func,
+ };
+ int listener_id;
+
+ BT_ASSERT_PRE_NON_NULL(graph, "Graph");
+ BT_ASSERT_PRE_NON_NULL(func, "Listener");
+ BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
+ BT_ASSERT_PRE(!graph->in_remove_listener,
+ "Graph currently executing a \"listener removed\" listener: "
+ "%!+g", graph);
+ g_array_append_val(graph->listeners.filter_filter_ports_disconnected,
+ listener);
+ listener_id = graph->listeners.filter_filter_ports_disconnected->len - 1;
+ BT_LIB_LOGV("Added \"filter to filter component ports disconnected\" listener to graph: "
+ "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
+ listener_id);
+
+ if (listener_id) {
+ *out_listener_id = listener_id;
+ }
+
+ return BT_GRAPH_STATUS_OK;
+}
+
+enum bt_graph_status
+bt_graph_add_filter_sink_component_ports_disconnected_listener(
+ struct bt_graph *graph,
+ bt_graph_filter_sink_component_ports_disconnected_listener_func func,
+ bt_graph_listener_removed_func listener_removed, void *data,
int *out_listener_id)
{
- struct bt_graph *graph = (void *) priv_graph;
struct bt_graph_listener_ports_disconnected listener = {
.base = {
.removed = listener_removed,
BT_ASSERT(port);
BT_LIB_LOGV("Notifying graph listeners that a port was added: "
"%![graph-]+g, %![port-]+p", graph, port);
- comp = bt_port_borrow_component(port);
+ comp = bt_port_borrow_component_inline(port);
BT_ASSERT(comp);
switch (comp->class->type) {
BT_LIB_LOGV("Notifying graph listeners that ports were connected: "
"%![graph-]+g, %![up-port-]+p, %![down-port-]+p",
graph, upstream_port, downstream_port);
- upstream_comp = bt_port_borrow_component(upstream_port);
+ upstream_comp = bt_port_borrow_component_inline(upstream_port);
BT_ASSERT(upstream_comp);
- downstream_comp = bt_port_borrow_component(downstream_port);
+ downstream_comp = bt_port_borrow_component_inline(downstream_port);
BT_ASSERT(downstream_comp);
switch (upstream_comp->class->type) {
case BT_COMPONENT_CLASS_TYPE_FILTER:
{
switch (downstream_comp->class->type) {
+ case BT_COMPONENT_CLASS_TYPE_FILTER:
+ listeners =
+ graph->listeners.filter_filter_ports_connected;
+ break;
case BT_COMPONENT_CLASS_TYPE_SINK:
listeners =
graph->listeners.filter_sink_ports_connected;
case BT_COMPONENT_CLASS_TYPE_FILTER:
{
switch (downstream_comp->class->type) {
+ case BT_COMPONENT_CLASS_TYPE_FILTER:
+ listeners =
+ graph->listeners.filter_filter_ports_disconnected;
+ break;
case BT_COMPONENT_CLASS_TYPE_SINK:
listeners =
graph->listeners.filter_sink_ports_disconnected;
}
}
-enum bt_graph_status bt_private_graph_cancel(
- struct bt_private_graph *priv_graph)
+enum bt_graph_status bt_graph_cancel(
+ struct bt_graph *graph)
{
- struct bt_graph *graph = (void *) priv_graph;
BT_ASSERT_PRE_NON_NULL(graph, "Graph");
graph->canceled = true;
return BT_GRAPH_STATUS_OK;
}
-bt_bool bt_graph_is_canceled(struct bt_graph *graph)
+bt_bool bt_graph_is_canceled(const struct bt_graph *graph)
{
BT_ASSERT_PRE_NON_NULL(graph, "Graph");
return graph->canceled ? BT_TRUE : BT_FALSE;
static
enum bt_graph_status add_component_with_init_method_data(
- struct bt_private_graph *priv_graph,
+ struct bt_graph *graph,
struct bt_component_class *comp_cls,
comp_init_method_t init_method,
- const char *name, struct bt_value *params,
+ const char *name, const struct bt_value *params,
void *init_method_data, struct bt_component **user_component)
{
- struct bt_graph *graph = (void *) priv_graph;
enum bt_graph_status graph_status = BT_GRAPH_STATUS_OK;
enum bt_self_component_status comp_status;
struct bt_component *component = NULL;
int ret;
bool init_can_consume;
+ struct bt_value *new_params = NULL;
BT_ASSERT(comp_cls);
BT_ASSERT_PRE_NON_NULL(graph, "Graph");
"Duplicate component name: %!+g, name=\"%s\"", graph, name);
BT_ASSERT_PRE(!params || bt_value_is_map(params),
"Parameter value is not a map value: %!+v", params);
- bt_object_get_ref(params);
init_can_consume = graph->can_consume;
bt_graph_set_can_consume(graph, false);
BT_LIB_LOGD("Adding component to graph: "
graph, comp_cls, name, params, init_method_data);
if (!params) {
- params = bt_private_value_borrow_value(
- bt_private_value_map_create());
- if (!params) {
+ new_params = bt_value_map_create();
+ if (!new_params) {
BT_LOGE_STR("Cannot create map value object.");
graph_status = BT_GRAPH_STATUS_NOMEM;
goto end;
}
+
+ params = new_params;
}
ret = bt_component_create(comp_cls, name, &component);
end:
bt_object_put_ref(component);
- bt_object_put_ref(params);
+ bt_object_put_ref(new_params);
(void) init_can_consume;
bt_graph_set_can_consume(graph, init_can_consume);
return graph_status;
}
enum bt_graph_status
-bt_private_graph_add_source_component_with_init_method_data(
- struct bt_private_graph *graph,
- struct bt_component_class_source *comp_cls,
- const char *name, struct bt_value *params,
- void *init_method_data, struct bt_component_source **component)
+bt_graph_add_source_component_with_init_method_data(
+ struct bt_graph *graph,
+ const struct bt_component_class_source *comp_cls,
+ const char *name, const struct bt_value *params,
+ void *init_method_data,
+ const struct bt_component_source **component)
{
BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
return add_component_with_init_method_data(graph,
name, params, init_method_data, (void *) component);
}
-enum bt_graph_status bt_private_graph_add_source_component(
- struct bt_private_graph *graph,
- struct bt_component_class_source *comp_cls,
- const char *name, struct bt_value *params,
- struct bt_component_source **component)
+enum bt_graph_status bt_graph_add_source_component(
+ struct bt_graph *graph,
+ const struct bt_component_class_source *comp_cls,
+ const char *name, const struct bt_value *params,
+ const struct bt_component_source **component)
{
- return bt_private_graph_add_source_component_with_init_method_data(
+ return bt_graph_add_source_component_with_init_method_data(
graph, comp_cls, name, params, NULL, component);
}
enum bt_graph_status
-bt_private_graph_add_filter_component_with_init_method_data(
- struct bt_private_graph *graph,
- struct bt_component_class_filter *comp_cls,
- const char *name, struct bt_value *params,
- void *init_method_data, struct bt_component_filter **component)
+bt_graph_add_filter_component_with_init_method_data(
+ struct bt_graph *graph,
+ const struct bt_component_class_filter *comp_cls,
+ const char *name, const struct bt_value *params,
+ void *init_method_data,
+ const struct bt_component_filter **component)
{
BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
return add_component_with_init_method_data(graph,
name, params, init_method_data, (void *) component);
}
-enum bt_graph_status bt_private_graph_add_filter_component(
- struct bt_private_graph *graph,
- struct bt_component_class_filter *comp_cls,
- const char *name, struct bt_value *params,
- struct bt_component_filter **component)
+enum bt_graph_status bt_graph_add_filter_component(
+ struct bt_graph *graph,
+ const struct bt_component_class_filter *comp_cls,
+ const char *name, const struct bt_value *params,
+ const struct bt_component_filter **component)
{
- return bt_private_graph_add_filter_component_with_init_method_data(
+ return bt_graph_add_filter_component_with_init_method_data(
graph, comp_cls, name, params, NULL, component);
}
enum bt_graph_status
-bt_private_graph_add_sink_component_with_init_method_data(
- struct bt_private_graph *graph,
- struct bt_component_class_sink *comp_cls,
- const char *name, struct bt_value *params,
- void *init_method_data, struct bt_component_sink **component)
+bt_graph_add_sink_component_with_init_method_data(
+ struct bt_graph *graph,
+ const struct bt_component_class_sink *comp_cls,
+ const char *name, const struct bt_value *params,
+ void *init_method_data,
+ const struct bt_component_sink **component)
{
BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
return add_component_with_init_method_data(graph,
name, params, init_method_data, (void *) component);
}
-enum bt_graph_status bt_private_graph_add_sink_component(
- struct bt_private_graph *graph,
- struct bt_component_class_sink *comp_cls,
- const char *name, struct bt_value *params,
- struct bt_component_sink **component)
+enum bt_graph_status bt_graph_add_sink_component(
+ struct bt_graph *graph,
+ const struct bt_component_class_sink *comp_cls,
+ const char *name, const struct bt_value *params,
+ const struct bt_component_sink **component)
{
- return bt_private_graph_add_sink_component_with_init_method_data(
+ return bt_graph_add_sink_component_with_init_method_data(
graph, comp_cls, name, params, NULL, component);
}
}
BT_HIDDEN
-void bt_graph_add_notification(struct bt_graph *graph,
- struct bt_notification *notif)
+void bt_graph_add_message(struct bt_graph *graph,
+ struct bt_message *msg)
{
BT_ASSERT(graph);
- BT_ASSERT(notif);
+ BT_ASSERT(msg);
/*
* It's okay not to take a reference because, when a
- * notification's reference count drops to 0, either:
+ * message's reference count drops to 0, either:
*
* * It is recycled back to one of this graph's pool.
* * It is destroyed because it doesn't have any link to any
* graph, which means the original graph is already destroyed.
*/
- g_ptr_array_add(graph->notifications, notif);
+ g_ptr_array_add(graph->messages, msg);
+}
+
+void bt_graph_get_ref(const struct bt_graph *graph)
+{
+ bt_object_get_ref(graph);
+}
+
+void bt_graph_put_ref(const struct bt_graph *graph)
+{
+ bt_object_put_ref(graph);
}