Standardize *get_*() functions
[babeltrace.git] / lib / graph / component.c
index 26d77605be391eb197814d43f67b8af38ca8d3fa..792a36145bf2aaf8dbf78c34c2fa990de11b56cc 100644 (file)
@@ -41,6 +41,7 @@
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/compiler-internal.h>
 #include <babeltrace/ref.h>
+#include <stdint.h>
 
 static
 struct bt_component * (* const component_create_funcs[])(
@@ -70,12 +71,23 @@ void bt_component_destroy(struct bt_object *obj)
 {
        struct bt_component *component = NULL;
        struct bt_component_class *component_class = NULL;
+       int i;
 
        if (!obj) {
                return;
        }
 
        component = container_of(obj, struct bt_component, base);
+
+       /* Call destroy listeners in reverse registration order */
+       for (i = component->destroy_listeners->len - 1; i >= 0; i--) {
+               struct bt_component_destroy_listener *listener =
+                       &g_array_index(component->destroy_listeners,
+                               struct bt_component_destroy_listener, i);
+
+               listener->func(component, listener->data);
+       }
+
        component_class = component->class;
 
        /*
@@ -99,6 +111,10 @@ void bt_component_destroy(struct bt_object *obj)
                g_ptr_array_free(component->output_ports, TRUE);
        }
 
+       if (component->destroy_listeners) {
+               g_array_free(component->destroy_listeners, TRUE);
+       }
+
        g_string_free(component->name, TRUE);
        bt_put(component_class);
        g_free(component);
@@ -173,17 +189,17 @@ end:
 }
 
 BT_HIDDEN
-uint64_t bt_component_get_input_port_count(struct bt_component *comp)
+int64_t bt_component_get_input_port_count(struct bt_component *comp)
 {
        assert(comp);
-       return comp->input_ports->len;
+       return (int64_t) comp->input_ports->len;
 }
 
 BT_HIDDEN
-uint64_t bt_component_get_output_port_count(struct bt_component *comp)
+int64_t bt_component_get_output_port_count(struct bt_component *comp)
 {
        assert(comp);
-       return comp->output_ports->len;
+       return (int64_t) comp->output_ports->len;
 }
 
 struct bt_component *bt_component_create_with_init_method_data(
@@ -195,6 +211,8 @@ struct bt_component *bt_component_create_with_init_method_data(
        enum bt_component_class_type type;
        struct bt_port *default_port = NULL;
 
+       bt_get(params);
+
        if (!component_class) {
                goto end;
        }
@@ -205,6 +223,21 @@ struct bt_component *bt_component_create_with_init_method_data(
                goto end;
        }
 
+       /*
+        * Parameters must be a map value, but we create a convenient
+        * empty one if it's NULL.
+        */
+       if (params) {
+               if (!bt_value_is_map(params)) {
+                       goto end;
+               }
+       } else {
+               params = bt_value_map_create();
+               if (!params) {
+                       goto end;
+               }
+       }
+
        component = component_create_funcs[type](component_class, params);
        if (!component) {
                goto end;
@@ -233,6 +266,13 @@ struct bt_component *bt_component_create_with_init_method_data(
                goto end;
        }
 
+       component->destroy_listeners = g_array_new(FALSE, TRUE,
+               sizeof(struct bt_component_destroy_listener));
+       if (!component->destroy_listeners) {
+               BT_PUT(component);
+               goto end;
+       }
+
        if (type == BT_COMPONENT_CLASS_TYPE_SOURCE ||
                        type == BT_COMPONENT_CLASS_TYPE_FILTER) {
                default_port = bt_component_add_port(component,
@@ -281,6 +321,7 @@ struct bt_component *bt_component_create_with_init_method_data(
 
        bt_component_class_freeze(component->class);
 end:
+       bt_put(params);
        bt_put(default_port);
        return component;
 }
@@ -374,7 +415,8 @@ struct bt_graph *bt_component_get_graph(
 }
 
 static
-struct bt_port *bt_component_get_port(GPtrArray *ports, const char *name)
+struct bt_port *bt_component_get_port_by_name(GPtrArray *ports,
+               const char *name)
 {
        size_t i;
        struct bt_port *ret_port = NULL;
@@ -399,29 +441,29 @@ struct bt_port *bt_component_get_port(GPtrArray *ports, const char *name)
 }
 
 BT_HIDDEN
-struct bt_port *bt_component_get_input_port(struct bt_component *comp,
+struct bt_port *bt_component_get_input_port_by_name(struct bt_component *comp,
                const char *name)
 {
        assert(comp);
 
-       return bt_component_get_port(comp->input_ports, name);
+       return bt_component_get_port_by_name(comp->input_ports, name);
 }
 
 BT_HIDDEN
-struct bt_port *bt_component_get_output_port(struct bt_component *comp,
+struct bt_port *bt_component_get_output_port_by_name(struct bt_component *comp,
                const char *name)
 {
        assert(comp);
 
-       return bt_component_get_port(comp->output_ports, name);
+       return bt_component_get_port_by_name(comp->output_ports, name);
 }
 
 static
-struct bt_port *bt_component_get_port_at_index(GPtrArray *ports, int index)
+struct bt_port *bt_component_get_port_by_index(GPtrArray *ports, uint64_t index)
 {
        struct bt_port *port = NULL;
 
-       if (index < 0 || index >= ports->len) {
+       if (index >= ports->len) {
                goto end;
        }
 
@@ -431,21 +473,21 @@ end:
 }
 
 BT_HIDDEN
-struct bt_port *bt_component_get_input_port_at_index(struct bt_component *comp,
-               int index)
+struct bt_port *bt_component_get_input_port_by_index(struct bt_component *comp,
+               uint64_t index)
 {
        assert(comp);
 
-       return bt_component_get_port_at_index(comp->input_ports, index);
+       return bt_component_get_port_by_index(comp->input_ports, index);
 }
 
 BT_HIDDEN
-struct bt_port *bt_component_get_output_port_at_index(struct bt_component *comp,
-               int index)
+struct bt_port *bt_component_get_output_port_by_index(struct bt_component *comp,
+               uint64_t index)
 {
        assert(comp);
 
-       return bt_component_get_port_at_index(comp->output_ports, index);
+       return bt_component_get_port_by_index(comp->output_ports, index);
 }
 
 BT_HIDDEN
@@ -465,7 +507,7 @@ struct bt_port *bt_component_add_output_port(
 }
 
 static
-void bt_component_remove_port_at_index(struct bt_component *component,
+void bt_component_remove_port_by_index(struct bt_component *component,
                GPtrArray *ports, size_t index)
 {
        struct bt_port *port;
@@ -521,7 +563,7 @@ enum bt_component_status bt_component_remove_port(
                struct bt_port *cur_port = g_ptr_array_index(ports, i);
 
                if (cur_port == port) {
-                       bt_component_remove_port_at_index(component,
+                       bt_component_remove_port_by_index(component,
                                ports, i);
                        goto end;
                }
@@ -581,3 +623,37 @@ void bt_component_port_disconnected(struct bt_component *comp,
                        bt_private_port_from_port(port));
        }
 }
+
+BT_HIDDEN
+void bt_component_add_destroy_listener(struct bt_component *component,
+               bt_component_destroy_listener_func func, void *data)
+{
+       struct bt_component_destroy_listener listener;
+
+       assert(component);
+       assert(func);
+       listener.func = func;
+       listener.data = data;
+       g_array_append_val(component->destroy_listeners, listener);
+}
+
+BT_HIDDEN
+void bt_component_remove_destroy_listener(struct bt_component *component,
+               bt_component_destroy_listener_func func, void *data)
+{
+       size_t i;
+
+       assert(component);
+       assert(func);
+
+       for (i = 0; i < component->destroy_listeners->len; i++) {
+               struct bt_component_destroy_listener *listener =
+                       &g_array_index(component->destroy_listeners,
+                               struct bt_component_destroy_listener, i);
+
+               if (listener->func == func && listener->data == data) {
+                       g_array_remove_index(component->destroy_listeners, i);
+                       i--;
+               }
+       }
+}
This page took 0.025698 seconds and 4 git commands to generate.