{
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);
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_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--;
+ }
+ }
+}