#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[])(
{
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;
/*
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);
}
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(
enum bt_component_class_type type;
struct bt_port *default_port = NULL;
+ bt_get(params);
+
if (!component_class) {
goto end;
}
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;
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,
bt_component_class_freeze(component->class);
end:
+ bt_put(params);
bt_put(default_port);
return component;
}
}
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;
}
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;
}
}
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
}
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;
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;
}
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--;
+ }
+ }
+}