X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Fgraph%2Fgraph.c;h=3c9be9ef28c358a025f429748533d9d5b4fddae0;hb=1d5d041416eed2a830515eafb32fc774470e9247;hp=e4aed1f28143550eb647d4a7065274289e257b07;hpb=eba7ea2176657164e825b34109a56af072770f3d;p=babeltrace.git diff --git a/src/lib/graph/graph.c b/src/lib/graph/graph.c index e4aed1f2..3c9be9ef 100644 --- a/src/lib/graph/graph.c +++ b/src/lib/graph/graph.c @@ -42,6 +42,7 @@ #include #include +#include "component-class-sink-simple.h" #include "component.h" #include "component-sink.h" #include "connection.h" @@ -57,8 +58,8 @@ typedef enum bt_graph_listener_func_status (*ports_connected_func_t)(const void *, const void *, const void *, const void *, void *); -typedef enum bt_component_class_init_method_status -(*comp_init_method_t)(const void *, const void *, void *); +typedef enum bt_component_class_initialize_method_status +(*comp_init_method_t)(const void *, void *, const void *, void *); struct bt_graph_listener { bt_graph_listener_removed_func removed; @@ -261,11 +262,15 @@ void notify_message_graph_is_destroyed(struct bt_message *msg) bt_message_unlink_graph(msg); } -struct bt_graph *bt_graph_create(void) +struct bt_graph *bt_graph_create(uint64_t mip_version) { struct bt_graph *graph; int ret; + BT_ASSERT_PRE(mip_version <= bt_get_maximal_mip_version(), + "Unknown MIP version: mip-version=%" PRIu64 ", " + "max-mip-version=%" PRIu64, + mip_version, bt_get_maximal_mip_version()); BT_LOGI_STR("Creating graph object."); graph = g_new0(struct bt_graph, 1); if (!graph) { @@ -274,6 +279,7 @@ struct bt_graph *bt_graph_create(void) } bt_object_init_shared(&graph->base, destroy_graph); + graph->mip_version = mip_version; graph->connections = g_ptr_array_new_with_free_func( (GDestroyNotify) bt_object_try_spec_release); if (!graph->connections) { @@ -297,7 +303,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.source_output_port_added); if (!graph->listeners.source_output_port_added) { - ret = -1; goto error; } @@ -305,7 +310,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.filter_output_port_added); if (!graph->listeners.filter_output_port_added) { - ret = -1; goto error; } @@ -313,7 +317,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.filter_input_port_added); if (!graph->listeners.filter_input_port_added) { - ret = -1; goto error; } @@ -321,7 +324,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.sink_input_port_added); if (!graph->listeners.sink_input_port_added) { - ret = -1; goto error; } @@ -329,7 +331,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.source_filter_ports_connected); if (!graph->listeners.source_filter_ports_connected) { - ret = -1; goto error; } @@ -337,7 +338,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.source_sink_ports_connected); if (!graph->listeners.source_sink_ports_connected) { - ret = -1; goto error; } @@ -345,7 +345,6 @@ struct bt_graph *bt_graph_create(void) graph->listeners.filter_filter_ports_connected); if (!graph->listeners.filter_filter_ports_connected) { - ret = -1; goto error; } @@ -353,12 +352,11 @@ struct bt_graph *bt_graph_create(void) graph->listeners.filter_sink_ports_connected); if (!graph->listeners.filter_sink_ports_connected) { - ret = -1; goto error; } graph->interrupters = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_object_put_no_null_check); + (GDestroyNotify) bt_object_put_ref_no_null_check); if (!graph->interrupters) { BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one GPtrArray."); goto error; @@ -700,9 +698,9 @@ end: return status; } -enum bt_graph_consume_status bt_graph_consume(struct bt_graph *graph) +enum bt_graph_run_once_status bt_graph_run_once(struct bt_graph *graph) { - enum bt_graph_consume_status status; + enum bt_graph_run_once_status status; BT_ASSERT_PRE_DEV_NON_NULL(graph, "Graph"); BT_ASSERT_PRE_DEV(graph->can_consume, @@ -1265,10 +1263,10 @@ int add_component_with_init_method_data( comp_init_method_t init_method, const char *name, const struct bt_value *params, void *init_method_data, bt_logging_level log_level, - struct bt_component **user_component) + const struct bt_component **user_component) { int status = BT_FUNC_STATUS_OK; - enum bt_component_class_init_method_status init_status; + enum bt_component_class_initialize_method_status init_status; struct bt_component *component = NULL; int ret; bool init_can_consume; @@ -1324,8 +1322,12 @@ int add_component_with_init_method_data( bt_value_freeze(params); if (init_method) { + /* + * There is no use for config objects right now, so just pass + * NULL. + */ BT_LOGD_STR("Calling user's initialization method."); - init_status = init_method(component, params, init_method_data); + init_status = init_method(component, NULL, params, init_method_data); BT_LOGD("User method returned: status=%s", bt_common_func_status_string(init_status)); if (init_status != BT_FUNC_STATUS_OK) { @@ -1352,7 +1354,8 @@ int add_component_with_init_method_data( /* * If it's a sink component, it needs to be part of the graph's - * sink queue to be consumed by bt_graph_consume(). + * sink queue to be consumed by bt_graph_run() or + * bt_graph_run_once(). */ if (bt_component_is_sink(component)) { graph->has_sink = true; @@ -1391,7 +1394,7 @@ end: } enum bt_graph_add_component_status -bt_graph_add_source_component_with_init_method_data( +bt_graph_add_source_component_with_initialize_method_data( struct bt_graph *graph, const struct bt_component_class_source *comp_cls, const char *name, const struct bt_value *params, @@ -1408,19 +1411,19 @@ enum bt_graph_add_component_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, - bt_logging_level log_level, + enum bt_logging_level log_level, const struct bt_component_source **component) { - return bt_graph_add_source_component_with_init_method_data( + return bt_graph_add_source_component_with_initialize_method_data( graph, comp_cls, name, params, NULL, log_level, component); } enum bt_graph_add_component_status -bt_graph_add_filter_component_with_init_method_data( +bt_graph_add_filter_component_with_initialize_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, bt_logging_level log_level, + void *init_method_data, enum bt_logging_level log_level, const struct bt_component_filter **component) { BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); @@ -1433,19 +1436,19 @@ enum bt_graph_add_component_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, - bt_logging_level log_level, + enum bt_logging_level log_level, const struct bt_component_filter **component) { - return bt_graph_add_filter_component_with_init_method_data( + return bt_graph_add_filter_component_with_initialize_method_data( graph, comp_cls, name, params, NULL, log_level, component); } enum bt_graph_add_component_status -bt_graph_add_sink_component_with_init_method_data( +bt_graph_add_sink_component_with_initialize_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, bt_logging_level log_level, + void *init_method_data, enum bt_logging_level log_level, const struct bt_component_sink **component) { BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class"); @@ -1458,13 +1461,51 @@ enum bt_graph_add_component_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, - bt_logging_level log_level, + enum bt_logging_level log_level, const struct bt_component_sink **component) { - return bt_graph_add_sink_component_with_init_method_data( + return bt_graph_add_sink_component_with_initialize_method_data( graph, comp_cls, name, params, NULL, log_level, component); } +enum bt_graph_add_component_status +bt_graph_add_simple_sink_component(struct bt_graph *graph, const char *name, + bt_graph_simple_sink_component_initialize_func init_func, + bt_graph_simple_sink_component_consume_func consume_func, + bt_graph_simple_sink_component_finalize_func finalize_func, + void *user_data, const bt_component_sink **component) +{ + enum bt_graph_add_component_status status; + struct bt_component_class_sink *comp_cls; + struct simple_sink_init_method_data init_method_data = { + .init_func = init_func, + .consume_func = consume_func, + .finalize_func = finalize_func, + .user_data = user_data, + }; + + /* + * Other preconditions are checked by + * bt_graph_add_sink_component_with_init_method_data(). + */ + BT_ASSERT_PRE_NON_NULL(consume_func, "Consume function"); + + comp_cls = bt_component_class_sink_simple_borrow(); + if (!comp_cls) { + BT_LIB_LOGE_APPEND_CAUSE( + "Cannot borrow simple sink component class."); + status = BT_FUNC_STATUS_MEMORY_ERROR; + goto end; + } + + status = bt_graph_add_sink_component_with_initialize_method_data(graph, + comp_cls, name, NULL, &init_method_data, + BT_LOGGING_LEVEL_NONE, component); + +end: + return status; +} + BT_HIDDEN int bt_graph_remove_unconnected_component(struct bt_graph *graph, struct bt_component *component) @@ -1573,7 +1614,7 @@ enum bt_graph_add_interrupter_status bt_graph_add_interrupter( BT_ASSERT_PRE_NON_NULL(graph, "Graph"); BT_ASSERT_PRE_NON_NULL(intr, "Interrupter"); g_ptr_array_add(graph->interrupters, (void *) intr); - bt_object_get_no_null_check(intr); + bt_object_get_ref_no_null_check(intr); BT_LIB_LOGD("Added interrupter to graph: %![graph-]+g, %![intr-]+z", graph, intr); return BT_FUNC_STATUS_OK;