From efa96d5dba10be33738c3fba9bff3f5b684a8104 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Fri, 10 Feb 2017 23:19:27 -0500 Subject: [PATCH] Add bt_component_class_query_info() API MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- .../component/component-class-internal.h | 1 + .../babeltrace/component/component-class.h | 12 +++++++ lib/component/component-class.c | 35 +++++++++++++++++++ 3 files changed, 48 insertions(+) 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; +} -- 2.34.1