Add bt_component_class_freeze()
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 26 Jan 2017 09:29:52 +0000 (04:29 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:37 +0000 (12:57 -0400)
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 <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/babeltrace/component/component-class-internal.h
include/babeltrace/component/component-class.h
lib/component/component-class.c
lib/component/component.c

index 320a7d93bd029a74cc71dcc4ceaa64c0dff574d1..2dacc8f0c5d312020b7af96305b924b508e71a2c 100644 (file)
@@ -35,6 +35,7 @@
 #include <babeltrace/component/component-class-sink.h>
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/object-internal.h>
+#include <stdbool.h>
 #include <glib.h>
 
 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 {
index ad259b29c79534d6969d9e9eae866a0d085735b3..ccb776f02ad8f87a2e2b64575a756319b345af4b 100644 (file)
@@ -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.
  *
index 22551f88c54c60d55a3da428adab72b71937e30b..55f020d219efa424313d4f3c39b2692500b5a1ad 100644 (file)
@@ -29,6 +29,7 @@
 #include <babeltrace/compiler.h>
 #include <babeltrace/component/component-class-internal.h>
 #include <babeltrace/ref.h>
+#include <stdbool.h>
 #include <glib.h>
 
 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;
+}
index fe1179c2834719b16c01bed79d17a1e1c378fa04..c188261c7554bcca85088e132359bf45d19c952f 100644 (file)
@@ -225,6 +225,8 @@ struct bt_component *bt_component_create(
                BT_PUT(component);
                goto end;
        }
+
+       bt_component_class_freeze(component->class);
 end:
        return component;
 }
This page took 0.039306 seconds and 4 git commands to generate.