From 34ac9eaff6dd507c75139d6f8d1870ef7a341d66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Mon, 19 Sep 2016 23:13:36 -0400 Subject: [PATCH] Add filter component type MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- configure.ac | 1 + include/babeltrace/plugin/component-factory.h | 5 + include/babeltrace/plugin/filter-internal.h | 67 ++++++++++++ include/babeltrace/plugin/filter.h | 64 +++++++++++ include/babeltrace/plugin/plugin-macros.h | 4 + include/babeltrace/plugin/plugin-system.h | 65 +++++++++++ include/babeltrace/plugin/source.h | 2 +- lib/plugin-system/component-factory.c | 9 ++ lib/plugin-system/filter.c | 35 ++++++ plugins/Makefile.am | 2 +- plugins/correlator/Makefile.am | 16 +++ plugins/correlator/correlator.c | 102 ++++++++++++++++++ 12 files changed, 370 insertions(+), 2 deletions(-) create mode 100644 lib/plugin-system/filter.c create mode 100644 plugins/correlator/Makefile.am create mode 100644 plugins/correlator/correlator.c diff --git a/configure.ac b/configure.ac index 5ad18a00..ac7e4393 100644 --- a/configure.ac +++ b/configure.ac @@ -383,6 +383,7 @@ AC_CONFIG_FILES([ plugins/ctf/common/notif-iter/Makefile plugins/ctf/fs/Makefile plugins/ctf/lttng-live/Makefile + plugins/correlator/Makefile plugins/text/Makefile babeltrace.pc babeltrace-ctf.pc diff --git a/include/babeltrace/plugin/component-factory.h b/include/babeltrace/plugin/component-factory.h index a04ee3d1..a36d6b72 100644 --- a/include/babeltrace/plugin/component-factory.h +++ b/include/babeltrace/plugin/component-factory.h @@ -148,6 +148,11 @@ bt_component_factory_register_sink_component_class( struct bt_component_factory *factory, const char *name, const char *description, bt_component_init_cb init); +extern enum bt_component_factory_status +bt_component_factory_register_filter_component_class( + struct bt_component_factory *factory, const char *name, + const char *description, bt_component_init_cb init); + #ifdef __cplusplus } #endif diff --git a/include/babeltrace/plugin/filter-internal.h b/include/babeltrace/plugin/filter-internal.h index e69de29b..271db63f 100644 --- a/include/babeltrace/plugin/filter-internal.h +++ b/include/babeltrace/plugin/filter-internal.h @@ -0,0 +1,67 @@ +#ifndef BABELTRACE_PLUGIN_FILTER_INTERNAL_H +#define BABELTRACE_PLUGIN_FILTER_INTERNAL_H + +/* + * BabelTrace - Filter Component Internal + * + * Copyright 2016 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include + +struct bt_value; + +struct bt_component_filter_class { + struct bt_component_class parent; +}; + +struct bt_component_filter { + struct bt_component parent; + bt_component_filter_init_iterator_cb init_iterator; +}; + +/** + * Allocate a filter component. + * + * @param class Component class + * @param params A dictionary of component parameters + * @returns A filter component instance + */ +BT_HIDDEN +struct bt_component *bt_component_filter_create( + struct bt_component_class *class, struct bt_value *params); + +/** + * Validate a filter component. + * + * @param component Filter component instance to validate + * @returns One of #bt_component_status + */ +BT_HIDDEN +enum bt_component_status bt_component_filter_validate( + struct bt_component *component); + +#endif /* BABELTRACE_PLUGIN_FILTER_INTERNAL_H */ diff --git a/include/babeltrace/plugin/filter.h b/include/babeltrace/plugin/filter.h index e69de29b..a3a8984c 100644 --- a/include/babeltrace/plugin/filter.h +++ b/include/babeltrace/plugin/filter.h @@ -0,0 +1,64 @@ +#ifndef BABELTRACE_PLUGIN_FILTER_H +#define BABELTRACE_PLUGIN_FILTER_H + +/* + * BabelTrace - Filter Plug-in Interface + * + * Copyright 2016 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct bt_component; +struct bt_notification_iterator; + +/** + * Add a notification iterator to a filter component. + * + * @param component Component instance + * @param iterator Notification iterator to add + * @returns One of #bt_component_status values + */ +enum bt_component_status bt_component_filter_add_iterator( + struct bt_component *component, + struct bt_notification_iterator *iterator); + +/** + * Create an iterator on a component instance. + * + * @param component Component instance + * @returns Notification iterator instance + */ +struct bt_notification_iterator *bt_component_filter_create_iterator( + struct bt_component *component); + +#ifdef __cplusplus +} +#endif + +#endif /* BABELTRACE_PLUGIN_FILTER_H */ diff --git a/include/babeltrace/plugin/plugin-macros.h b/include/babeltrace/plugin/plugin-macros.h index 26c3ebc3..4fb107f9 100644 --- a/include/babeltrace/plugin/plugin-macros.h +++ b/include/babeltrace/plugin/plugin-macros.h @@ -52,6 +52,10 @@ bt_component_factory_register_sink_component_class(factory, \ _name, _description, _init); +#define BT_PLUGIN_FILTER_COMPONENT_CLASS_ENTRY(_name, _description, _init) \ + bt_component_factory_register_filter_component_class(factory, \ + _name, _description, _init); + #define BT_PLUGIN_COMPONENT_CLASSES_END \ return BT_COMPONENT_STATUS_OK; \ } \ diff --git a/include/babeltrace/plugin/plugin-system.h b/include/babeltrace/plugin/plugin-system.h index ec84b872..70b67cfd 100644 --- a/include/babeltrace/plugin/plugin-system.h +++ b/include/babeltrace/plugin/plugin-system.h @@ -183,6 +183,71 @@ extern enum bt_component_status bt_component_sink_get_input_iterator(struct bt_component *sink, unsigned int input, struct bt_notification_iterator **iterator); +/** bt_component_filter */ +/** + * Iterator initialization function type. + * + * A notification iterator's private data, deinitialization, next, and get + * callbacks must be set by this function. + * + * @param filter Filter component instance + * @param iterator Notification iterator instance + */ +typedef enum bt_component_status (*bt_component_filter_init_iterator_cb)( + struct bt_component *, struct bt_notification_iterator *); + +/** + * Iterator addition function type. + * + * A filter component may choose to refuse the addition of an iterator + * by not returning BT_COMPONENT_STATUS_OK. + * + * @param filter Filter component instance + * @returns One of #bt_component_status values + */ +typedef enum bt_component_status (*bt_component_filter_add_iterator_cb)( + struct bt_component *, struct bt_notification_iterator *); + +/** + * Set a filter component's iterator initialization function. + * + * @param filter Filter component instance + * @param init_iterator Notification iterator initialization callback + */ +extern enum bt_component_status +bt_component_filter_set_iterator_init_cb(struct bt_component *filter, + bt_component_filter_init_iterator_cb init_iterator); + +/** + * Set a filter component's iterator addition callback. + * + * @param filter Filter component instance + * @param add_iterator Iterator addition callback + * @returns One of #bt_component_status values + */ +extern enum bt_component_status +bt_component_filter_set_add_iterator_cb(struct bt_component *filter, + bt_component_filter_add_iterator_cb add_iterator); + +/* Defaults to 1. */ +extern enum bt_component_status +bt_component_filter_set_minimum_input_count(struct bt_component *filter, + unsigned int minimum); + +/* Defaults to 1. */ +extern enum bt_component_status +bt_component_filter_set_maximum_input_count(struct bt_component *filter, + unsigned int maximum); + +extern enum bt_component_status +bt_component_filter_get_input_count(struct bt_component *filter, + unsigned int *count); + +/* May return NULL after an interator has reached its end. */ +extern enum bt_component_status +bt_component_filter_get_input_iterator(struct bt_component *filter, + unsigned int input, struct bt_notification_iterator **iterator); + /** bt_notification_iterator */ /** * Function returning an iterator's current notification. diff --git a/include/babeltrace/plugin/source.h b/include/babeltrace/plugin/source.h index 7329eeeb..51df185d 100644 --- a/include/babeltrace/plugin/source.h +++ b/include/babeltrace/plugin/source.h @@ -4,7 +4,7 @@ /* * BabelTrace - Source Plug-in Interface * - * Copyright 2015 Jérémie Galarneau + * Copyright 2016 Jérémie Galarneau * * Author: Jérémie Galarneau * diff --git a/lib/plugin-system/component-factory.c b/lib/plugin-system/component-factory.c index 3fb02057..8fe32f81 100644 --- a/lib/plugin-system/component-factory.c +++ b/lib/plugin-system/component-factory.c @@ -458,3 +458,12 @@ bt_component_factory_register_sink_component_class( return add_component_class(factory, name, description, init, BT_COMPONENT_TYPE_SINK); } + +enum bt_component_factory_status +bt_component_factory_register_filter_component_class( + struct bt_component_factory *factory, const char *name, + const char *description, bt_component_init_cb init) +{ + return add_component_class(factory, name, description, init, + BT_COMPONENT_TYPE_FILTER); +} diff --git a/lib/plugin-system/filter.c b/lib/plugin-system/filter.c new file mode 100644 index 00000000..33cceaef --- /dev/null +++ b/lib/plugin-system/filter.c @@ -0,0 +1,35 @@ +/* + * filter.c + * + * Babeltrace Filter Component + * + * Copyright 2016 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include +#include + + diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 41568098..eee13497 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -1 +1 @@ -SUBDIRS = ctf text +SUBDIRS = ctf text correlator diff --git a/plugins/correlator/Makefile.am b/plugins/correlator/Makefile.am new file mode 100644 index 00000000..43e26164 --- /dev/null +++ b/plugins/correlator/Makefile.am @@ -0,0 +1,16 @@ +AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include + +SUBDIRS = . + +plugindir = "$(PLUGINSDIR)" +plugin_LTLIBRARIES = libbabeltrace-plugin-correlator.la + +libbabeltrace_plugin_correlator_la_SOURCES = \ + correlator.h correlator.c + +libbabeltrace_plugin_correlator_la_LDFLAGS = \ + -version-info $(BABELTRACE_LIBRARY_VERSION) + +libbabeltrace_plugin_ctf_text_la_LIBADD = \ + $(top_builddir)/lib/libbabeltrace.la \ + $(top_builddir)/formats/ctf/libbabeltrace-ctf.la diff --git a/plugins/correlator/correlator.c b/plugins/correlator/correlator.c new file mode 100644 index 00000000..c0c9dc72 --- /dev/null +++ b/plugins/correlator/correlator.c @@ -0,0 +1,102 @@ +/* + * correlator.c + * + * Babeltrace Trace Correlator + * + * Copyright 2016 Jérémie Galarneau + * + * Author: Jérémie Galarneau + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include "correlator.h" + +static +void destroy_correlator_data(struct correlator *correlator) +{ + g_free(correlator); +} + +static +struct correlator *create_correlator(void) +{ + struct correlator *correlator; + + correlator = g_new0(struct correlator, 1); + if (!correlator) { + goto end; + } +end: + return correlator; +} + +static +void destroy_correlator(struct bt_component *component) +{ + void *data = bt_component_get_private_data(component); + + destroy_correlator_data(data); +} + +enum bt_component_status correlator_component_init( + struct bt_component *component, struct bt_value *params) +{ + enum bt_component_status ret; + struct correlator *correlator = create_correlator(); + + if (!correlator) { + ret = BT_COMPONENT_STATUS_NOMEM; + goto end; + } + + ret = bt_component_set_destroy_cb(component, + destroy_correlator); + if (ret != BT_COMPONENT_STATUS_OK) { + goto error; + } + + ret = bt_component_set_private_data(component, correlator); + if (ret != BT_COMPONENT_STATUS_OK) { + goto error; + } +end: + return ret; +error: + destroy_correlator_data(correlator); + return ret; +} + +/* Initialize plug-in entry points. */ +BT_PLUGIN_NAME("correlator"); +BT_PLUGIN_DESCRIPTION("Babeltrace Trace Correlator Plug-In."); +BT_PLUGIN_AUTHOR("Jérémie Galarneau"); +BT_PLUGIN_LICENSE("MIT"); + +BT_PLUGIN_COMPONENT_CLASSES_BEGIN +BT_PLUGIN_FILTER_COMPONENT_CLASS_ENTRY("correlator", + "Time-correlate multiple traces.", + correlator_component_init) +BT_PLUGIN_COMPONENT_CLASSES_END -- 2.34.1