X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fgraph%2Fgraph-internal.h;h=cd1b557d946a9287a705abf333a5fe454397f2c1;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hp=677c65bd219edc5cf1b9779ac1a60e3b79ce955b;hpb=2de524b31c22e92a264e1324a0981fc312516c53;p=babeltrace.git diff --git a/include/babeltrace/graph/graph-internal.h b/include/babeltrace/graph/graph-internal.h index 677c65bd..cd1b557d 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 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,18 @@ struct bt_graph { 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; @@ -69,6 +82,20 @@ struct bt_graph { } listeners; }; +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); @@ -91,6 +118,18 @@ 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); + static inline const char *bt_graph_status_string(enum bt_graph_status status) { @@ -113,6 +152,8 @@ const char *bt_graph_status_string(enum bt_graph_status status) 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)"; } @@ -149,4 +190,4 @@ enum bt_graph_status bt_graph_status_from_component_status( } } -#endif /* BABELTRACE_COMPONENT_COMPONENT_GRAPH_INTERNAL_H */ +#endif /* BABELTRACE_GRAPH_GRAPH_INTERNAL_H */