X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fgraph%2Fgraph-internal.h;h=9e6012ec641e18225640869a8429db2205ec15fd;hb=5c5632787fc9cafa602c89a28966bcfd01ec0204;hp=85c196be6e2bf4793d09da989f7b9b96b80b6307;hpb=f345f8bb507db96ad6f068f404603f6390fa34ce;p=babeltrace.git diff --git a/include/babeltrace/graph/graph-internal.h b/include/babeltrace/graph/graph-internal.h index 85c196be..9e6012ec 100644 --- a/include/babeltrace/graph/graph-internal.h +++ b/include/babeltrace/graph/graph-internal.h @@ -1,5 +1,5 @@ -#ifndef BABELTRACE_COMPONENT_COMPONENT_GRAPH_INTERNAL_H -#define BABELTRACE_COMPONENT_COMPONENT_GRAPH_INTERNAL_H +#ifndef BABELTRACE_GRAPH_GRAPH_INTERNAL_H +#define BABELTRACE_GRAPH_GRAPH_INTERNAL_H /* * BabelTrace - Component Graph Internal @@ -28,8 +28,13 @@ */ #include +#include +#include #include #include +#include +#include +#include #include struct bt_component; @@ -55,14 +60,69 @@ struct bt_graph { /* Queue of pointers (weak references) to sink bt_components. */ GQueue *sinks_to_consume; + bt_bool canceled; + bt_bool in_remove_listener; + bt_bool has_sink; + + /* + * If this is BT_FALSE, then the public API's consuming + * functions (bt_graph_consume() and bt_graph_run()) return + * BT_GRAPH_STATUS_CANNOT_CONSUME. The internal "no check" + * functions always work. + * + * In bt_output_port_notification_iterator_create(), on success, + * this flag is cleared so that the iterator remains the only + * consumer for the graph's lifetime. + */ + bt_bool can_consume; + struct { GArray *port_added; GArray *port_removed; GArray *ports_connected; GArray *ports_disconnected; } listeners; + + /* Pool of `struct bt_notification_event *` */ + struct bt_object_pool event_notif_pool; + + /* Pool of `struct bt_notification_packet_begin *` */ + struct bt_object_pool packet_begin_notif_pool; + + /* Pool of `struct bt_notification_packet_end *` */ + struct bt_object_pool packet_end_notif_pool; + + /* + * Array of `struct bt_notification *` (weak). + * + * This is an array of all the notifications ever created from + * this graph. Some of them can be in one of the pools above, + * some of them can be at large. Because each notification has a + * weak pointer to the graph containing its pool, we need to + * notify each notification that the graph is gone on graph + * destruction. + * + * TODO: When we support a maximum size for object pools, + * add a way for a notification to remove itself from this + * array (on destruction). + */ + GPtrArray *notifications; }; +static inline +void bt_graph_set_can_consume(struct bt_graph *graph, bt_bool can_consume) +{ + BT_ASSERT(graph); + graph->can_consume = can_consume; +} + +BT_HIDDEN +enum bt_graph_status bt_graph_consume_no_check(struct bt_graph *graph); + +BT_HIDDEN +enum bt_graph_status bt_graph_consume_sink_no_check(struct bt_graph *graph, + struct bt_component *sink); + BT_HIDDEN void bt_graph_notify_port_added(struct bt_graph *graph, struct bt_port *port); @@ -81,4 +141,84 @@ void bt_graph_notify_ports_disconnected(struct bt_graph *graph, struct bt_port *upstream_port, struct bt_port *downstream_port); -#endif /* BABELTRACE_COMPONENT_COMPONENT_GRAPH_INTERNAL_H */ +BT_HIDDEN +void bt_graph_remove_connection(struct bt_graph *graph, + struct bt_connection *connection); + +/* + * This only works with a component which is not connected at this + * point. + * + * Also the reference count of `component` should be 0 when you call + * this function, which means only `graph` owns the component, so it + * is safe to destroy. + */ +BT_HIDDEN +int bt_graph_remove_unconnected_component(struct bt_graph *graph, + struct bt_component *component); + +BT_HIDDEN +void bt_graph_add_notification(struct bt_graph *graph, + struct bt_notification *notif); + +static inline +const char *bt_graph_status_string(enum bt_graph_status status) +{ + switch (status) { + case BT_GRAPH_STATUS_CANCELED: + return "BT_GRAPH_STATUS_CANCELED"; + case BT_GRAPH_STATUS_AGAIN: + return "BT_GRAPH_STATUS_AGAIN"; + case BT_GRAPH_STATUS_END: + return "BT_GRAPH_STATUS_END"; + case BT_GRAPH_STATUS_OK: + return "BT_GRAPH_STATUS_OK"; + case BT_GRAPH_STATUS_INVALID: + return "BT_GRAPH_STATUS_INVALID"; + case BT_GRAPH_STATUS_NO_SINK: + return "BT_GRAPH_STATUS_NO_SINK"; + case BT_GRAPH_STATUS_ERROR: + return "BT_GRAPH_STATUS_ERROR"; + case BT_GRAPH_STATUS_COMPONENT_REFUSES_PORT_CONNECTION: + return "BT_GRAPH_STATUS_COMPONENT_REFUSES_PORT_CONNECTION"; + case BT_GRAPH_STATUS_NOMEM: + return "BT_GRAPH_STATUS_NOMEM"; + case BT_GRAPH_STATUS_CANNOT_CONSUME: + return "BT_GRAPH_STATUS_CANNOT_CONSUME"; + default: + return "(unknown)"; + } +} + +static inline +enum bt_graph_status bt_graph_status_from_component_status( + enum bt_component_status comp_status) +{ + switch (comp_status) { + case BT_COMPONENT_STATUS_OK: + return BT_GRAPH_STATUS_OK; + case BT_COMPONENT_STATUS_END: + return BT_GRAPH_STATUS_END; + case BT_COMPONENT_STATUS_AGAIN: + return BT_GRAPH_STATUS_AGAIN; + case BT_COMPONENT_STATUS_REFUSE_PORT_CONNECTION: + return BT_GRAPH_STATUS_COMPONENT_REFUSES_PORT_CONNECTION; + case BT_COMPONENT_STATUS_ERROR: + return BT_GRAPH_STATUS_ERROR; + case BT_COMPONENT_STATUS_UNSUPPORTED: + return BT_GRAPH_STATUS_ERROR; + case BT_COMPONENT_STATUS_INVALID: + return BT_GRAPH_STATUS_INVALID; + case BT_COMPONENT_STATUS_NOMEM: + return BT_GRAPH_STATUS_NOMEM; + case BT_COMPONENT_STATUS_NOT_FOUND: + return BT_GRAPH_STATUS_ERROR; + default: +#ifdef BT_LOGF + BT_LOGF("Unknown component status: status=%d", comp_status); +#endif + abort(); + } +} + +#endif /* BABELTRACE_GRAPH_GRAPH_INTERNAL_H */