#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/compiler-internal.h>
#include <babeltrace/ref.h>
+#include <babeltrace/types.h>
#include <stdint.h>
static
return;
}
+ /*
+ * The component's reference count is 0 if we're here. Increment
+ * it to avoid a double-destroy (possibly infinitely recursive).
+ * This could happen for example if the component's finalization
+ * function does bt_get() (or anything that causes bt_get() to
+ * be called) on itself (ref. count goes from 0 to 1), and then
+ * bt_put(): the reference count would go from 1 to 0 again and
+ * this function would be called again.
+ */
+ obj->ref_count.count++;
component = container_of(obj, struct bt_component, base);
/* Call destroy listeners in reverse registration order */
static
struct bt_port *bt_component_add_port(
struct bt_component *component, GPtrArray *ports,
- enum bt_port_type port_type, const char *name)
+ enum bt_port_type port_type, const char *name, void *user_data)
{
size_t i;
struct bt_port *new_port = NULL;
}
}
- new_port = bt_port_create(component, port_type, name);
+ new_port = bt_port_create(component, port_type, name, user_data);
if (!new_port) {
goto end;
}
int ret;
struct bt_component *component = NULL;
enum bt_component_class_type type;
- struct bt_port *default_port = NULL;
bt_get(params);
goto end;
}
- if (type == BT_COMPONENT_CLASS_TYPE_SOURCE ||
- type == BT_COMPONENT_CLASS_TYPE_FILTER) {
- default_port = bt_component_add_port(component,
- component->output_ports, BT_PORT_TYPE_OUTPUT,
- DEFAULT_OUTPUT_PORT_NAME);
- if (!default_port) {
- BT_PUT(component);
- goto end;
- }
-
- BT_PUT(default_port);
- }
-
- if (type == BT_COMPONENT_CLASS_TYPE_FILTER ||
- type == BT_COMPONENT_CLASS_TYPE_SINK) {
- default_port = bt_component_add_port(component,
- component->input_ports, BT_PORT_TYPE_INPUT,
- DEFAULT_INPUT_PORT_NAME);
- if (!default_port) {
- BT_PUT(component);
- goto end;
- }
-
- BT_PUT(default_port);
- }
-
- component->initializing = true;
+ component->initializing = BT_TRUE;
if (component_class->methods.init) {
ret = component_class->methods.init(
bt_private_component_from_component(component), params,
init_method_data);
- component->initializing = false;
+ component->initializing = BT_FALSE;
if (ret != BT_COMPONENT_STATUS_OK) {
BT_PUT(component);
goto end;
}
}
- component->initializing = false;
+ component->initializing = BT_FALSE;
ret = component_validation_funcs[type](component);
if (ret != BT_COMPONENT_STATUS_OK) {
BT_PUT(component);
bt_component_class_freeze(component->class);
end:
bt_put(params);
- bt_put(default_port);
return component;
}
BT_HIDDEN
struct bt_port *bt_component_add_input_port(
- struct bt_component *component, const char *name)
+ struct bt_component *component, const char *name,
+ void *user_data)
{
return bt_component_add_port(component, component->input_ports,
- BT_PORT_TYPE_INPUT, name);
+ BT_PORT_TYPE_INPUT, name, user_data);
}
BT_HIDDEN
struct bt_port *bt_component_add_output_port(
- struct bt_component *component, const char *name)
+ struct bt_component *component, const char *name,
+ void *user_data)
{
return bt_component_add_port(component, component->output_ports,
- BT_PORT_TYPE_OUTPUT, name);
+ BT_PORT_TYPE_OUTPUT, name, user_data);
}
static