From 1e4d8103c3bac7dfe6f9d966acadc4512b861ee6 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Thu, 26 Jan 2017 04:29:52 -0500 Subject: [PATCH] Add bt_component_class_freeze() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It is somewhat essential for a component class provider (plugin or whatever else) to make sure that its created, shared component class is not modified once properly configured. The new bt_component_class_freeze() function freezes a component class object so that it becomes immutable. bt_component_create() also has the side effect of freezing its class. This is analogous to bt_event_create() which freezes its class. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- .../component/component-class-internal.h | 2 ++ .../babeltrace/component/component-class.h | 3 ++ lib/component/component-class.c | 31 +++++++++++++++---- lib/component/component.c | 2 ++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/include/babeltrace/component/component-class-internal.h b/include/babeltrace/component/component-class-internal.h index 320a7d93..2dacc8f0 100644 --- a/include/babeltrace/component/component-class-internal.h +++ b/include/babeltrace/component/component-class-internal.h @@ -35,6 +35,7 @@ #include #include #include +#include #include struct bt_component_class; @@ -58,6 +59,7 @@ struct bt_component_class { } methods; /* Array of struct bt_component_class_destroy_listener */ GArray *destroy_listeners; + bool frozen; }; struct bt_component_class_source { diff --git a/include/babeltrace/component/component-class.h b/include/babeltrace/component/component-class.h index ad259b29..ccb776f0 100644 --- a/include/babeltrace/component/component-class.h +++ b/include/babeltrace/component/component-class.h @@ -66,6 +66,9 @@ extern int bt_component_class_set_description( struct bt_component_class *component_class, const char *description); +extern int bt_component_class_freeze( + struct bt_component_class *component_class); + /** * Get a component class' name. * diff --git a/lib/component/component-class.c b/lib/component/component-class.c index 22551f88..55f020d2 100644 --- a/lib/component/component-class.c +++ b/lib/component/component-class.c @@ -29,6 +29,7 @@ #include #include #include +#include #include static @@ -202,7 +203,7 @@ int bt_component_class_set_init_method( { int ret = 0; - if (!component_class || !init_method) { + if (!component_class || component_class->frozen || !init_method) { ret = -1; goto end; } @@ -219,7 +220,7 @@ int bt_component_class_set_destroy_method( { int ret = 0; - if (!component_class || !destroy_method) { + if (!component_class || component_class->frozen || !destroy_method) { ret = -1; goto end; } @@ -236,7 +237,7 @@ extern int bt_component_class_set_description( { int ret = 0; - if (!component_class || !description) { + if (!component_class || component_class->frozen || !description) { ret = -1; goto end; } @@ -274,7 +275,7 @@ int bt_component_class_add_destroy_listener(struct bt_component_class *class, int ret = 0; struct bt_component_class_destroy_listener listener; - if (!class || !func) { + if (!class || class->frozen || !func) { ret = -1; goto end; } @@ -294,7 +295,8 @@ extern int bt_component_class_sink_set_add_iterator_method( struct bt_component_class_sink *sink_class; int ret = 0; - if (!component_class || !add_iterator_method || + if (!component_class || component_class->frozen || + !add_iterator_method || component_class->type != BT_COMPONENT_CLASS_TYPE_SINK) { ret = -1; goto end; @@ -315,7 +317,8 @@ extern int bt_component_class_filter_set_add_iterator_method( struct bt_component_class_filter *filter_class; int ret = 0; - if (!component_class || !add_iterator_method || + if (!component_class || component_class->frozen || + !add_iterator_method || component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) { ret = -1; @@ -329,3 +332,19 @@ extern int bt_component_class_filter_set_add_iterator_method( end: return ret; } + +int bt_component_class_freeze( + struct bt_component_class *component_class) +{ + int ret = 0; + + if (!component_class) { + ret = -1; + goto end; + } + + component_class->frozen = true; + +end: + return ret; +} diff --git a/lib/component/component.c b/lib/component/component.c index fe1179c2..c188261c 100644 --- a/lib/component/component.c +++ b/lib/component/component.c @@ -225,6 +225,8 @@ struct bt_component *bt_component_create( BT_PUT(component); goto end; } + + bt_component_class_freeze(component->class); end: return component; } -- 2.34.1