From: Philippe Proulx Date: Sat, 11 Feb 2017 04:19:27 +0000 (-0500) Subject: Add bt_component_class_query_info() API X-Git-Tag: v2.0.0-pre1~487 X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=efa96d5dba10be33738c3fba9bff3f5b684a8104;hp=9987e1accc6f5cdee18e5ae8fbb1f451a7080987;p=babeltrace.git Add bt_component_class_query_info() API When you create a component class, you can set an optional "query info" class method with bt_component_class_sink_set_query_info_method(). A "query info" class method is a method which accepts an action name and custom parameters and returns custom results. It can be used for component class-specific requests such as getting the beginning and end timestamps of a trace, its total size, and other statistics. On some real-time source component class, it can be used to get a list of endpoints to which to connect. You can use bt_component_class_query_info() to query a component class. The action name and parameters are mandatory, although you can use bt_value_null for the parameters. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- diff --git a/include/babeltrace/component/component-class-internal.h b/include/babeltrace/component/component-class-internal.h index 856621db..7ec59b95 100644 --- a/include/babeltrace/component/component-class-internal.h +++ b/include/babeltrace/component/component-class-internal.h @@ -57,6 +57,7 @@ struct bt_component_class { struct { bt_component_class_init_method init; bt_component_class_destroy_method destroy; + bt_component_class_query_info_method query_info; } methods; /* Array of struct bt_component_class_destroy_listener */ GArray *destroy_listeners; diff --git a/include/babeltrace/component/component-class.h b/include/babeltrace/component/component-class.h index aee24740..9a631be0 100644 --- a/include/babeltrace/component/component-class.h +++ b/include/babeltrace/component/component-class.h @@ -73,6 +73,10 @@ typedef enum bt_notification_iterator_status (*bt_component_class_notification_iterator_seek_time_method)( struct bt_notification_iterator *iterator, int64_t time); +typedef struct bt_value *(*bt_component_class_query_info_method)( + struct bt_component_class *component_class, + const char *action, struct bt_value *params); + extern int bt_component_class_set_init_method( struct bt_component_class *component_class, bt_component_class_init_method init_method); @@ -116,6 +120,14 @@ extern const char *bt_component_class_get_description( extern const char *bt_component_class_get_help( struct bt_component_class *component_class); +extern int bt_component_class_set_query_info_method( + struct bt_component_class *component_class, + bt_component_class_query_info_method query_info_method); + +extern struct bt_value *bt_component_class_query_info( + struct bt_component_class *component_class, + const char *action, struct bt_value *params); + /** * Get a component class' type. * diff --git a/lib/component/component-class.c b/lib/component/component-class.c index 72bea187..4e337e03 100644 --- a/lib/component/component-class.c +++ b/lib/component/component-class.c @@ -228,6 +228,23 @@ end: return ret; } +int bt_component_class_set_query_info_method( + struct bt_component_class *component_class, + bt_component_class_query_info_method query_info_method) +{ + int ret = 0; + + if (!component_class || component_class->frozen || !query_info_method) { + ret = -1; + goto end; + } + + component_class->methods.query_info = query_info_method; + +end: + return ret; +} + int bt_component_class_set_destroy_method( struct bt_component_class *component_class, bt_component_class_destroy_method destroy_method) @@ -524,3 +541,21 @@ int bt_component_class_freeze( end: return ret; } + +struct bt_value *bt_component_class_query_info( + struct bt_component_class *component_class, + const char *action, struct bt_value *params) +{ + struct bt_value *results = NULL; + + if (!component_class || !action || !params || + !component_class->methods.query_info) { + goto end; + } + + results = component_class->methods.query_info(component_class, + action, params); + +end: + return results; +}