* SOFTWARE.
*/
+#define BT_LOG_TAG "COMP-CLASS"
+#include <babeltrace/lib-logging-internal.h>
+
#include <babeltrace/compiler-internal.h>
#include <babeltrace/graph/component-class-internal.h>
#include <babeltrace/ref.h>
#include <babeltrace/types.h>
+#include <babeltrace/assert-internal.h>
#include <glib.h>
static
struct bt_component_class *class;
int i;
- assert(obj);
+ BT_ASSERT(obj);
class = container_of(obj, struct bt_component_class, base);
+ BT_LOGD("Destroying component class: "
+ "addr=%p, name=\"%s\", type=%s",
+ class, bt_component_class_get_name(class),
+ bt_component_class_type_string(class->type));
+
/* Call destroy listeners in reverse registration order */
for (i = class->destroy_listeners->len - 1; i >= 0; i--) {
struct bt_component_class_destroy_listener *listener =
struct bt_component_class_destroy_listener,
i);
+ BT_LOGD("Calling destroy listener: func-addr=%p, data-addr=%p",
+ listener->func, listener->data);
listener->func(class, listener->data);
}
class->type = type;
class->name = g_string_new(name);
if (!class->name) {
+ BT_LOGE_STR("Failed to allocate a GString.");
goto error;
}
class->description = g_string_new(NULL);
if (!class->description) {
+ BT_LOGE_STR("Failed to allocate a GString.");
goto error;
}
class->help = g_string_new(NULL);
if (!class->help) {
+ BT_LOGE_STR("Failed to allocate a GString.");
goto error;
}
class->destroy_listeners = g_array_new(FALSE, TRUE,
sizeof(struct bt_component_class_destroy_listener));
if (!class->destroy_listeners) {
+ BT_LOGE_STR("Failed to allocate a GArray.");
goto error;
}
}
struct bt_component_class *bt_component_class_source_create(const char *name,
- bt_component_class_notification_iterator_next_method notification_iterator_next_method)
+ bt_component_class_notification_iterator_next_method method)
{
struct bt_component_class_source *source_class = NULL;
int ret;
- if (!name || !notification_iterator_next_method) {
+ if (!name) {
+ BT_LOGW_STR("Invalid parameter: name is NULL.");
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
goto end;
}
+ BT_LOGD("Creating source component class: "
+ "name=\"%s\", notif-iter-next-method-addr=%p",
+ name, method);
source_class = g_new0(struct bt_component_class_source, 1);
if (!source_class) {
+ BT_LOGE_STR("Failed to allocate one source component class.");
goto end;
}
+ /* bt_component_class_init() logs errors */
ret = bt_component_class_init(&source_class->parent,
BT_COMPONENT_CLASS_TYPE_SOURCE, name);
if (ret) {
goto end;
}
- source_class->methods.iterator.next = notification_iterator_next_method;
+ source_class->methods.iterator.next = method;
+ BT_LOGD("Created source component class: "
+ "name=\"%s\", notif-iter-next-method-addr=%p, addr=%p",
+ name, method, &source_class->parent);
end:
return &source_class->parent;
}
struct bt_component_class *bt_component_class_filter_create(const char *name,
- bt_component_class_notification_iterator_next_method notification_iterator_next_method)
+ bt_component_class_notification_iterator_next_method method)
{
struct bt_component_class_filter *filter_class = NULL;
int ret;
- if (!name || !notification_iterator_next_method) {
+ if (!name) {
+ BT_LOGW_STR("Invalid parameter: name is NULL.");
goto end;
}
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ goto end;
+ }
+
+ BT_LOGD("Creating filter component class: "
+ "name=\"%s\", notif-iter-next-method-addr=%p",
+ name, method);
filter_class = g_new0(struct bt_component_class_filter, 1);
if (!filter_class) {
+ BT_LOGE_STR("Failed to allocate one filter component class.");
goto end;
}
+ /* bt_component_class_init() logs errors */
ret = bt_component_class_init(&filter_class->parent,
BT_COMPONENT_CLASS_TYPE_FILTER, name);
if (ret) {
goto end;
}
- filter_class->methods.iterator.next = notification_iterator_next_method;
+ filter_class->methods.iterator.next = method;
+ BT_LOGD("Created filter component class: "
+ "name=\"%s\", notif-iter-next-method-addr=%p, addr=%p",
+ name, method, &filter_class->parent);
end:
return &filter_class->parent;
}
struct bt_component_class *bt_component_class_sink_create(const char *name,
- bt_component_class_sink_consume_method consume_method)
+ bt_component_class_sink_consume_method method)
{
struct bt_component_class_sink *sink_class = NULL;
int ret;
- if (!name || !consume_method) {
+ if (!name) {
+ BT_LOGW_STR("Invalid parameter: name is NULL.");
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
goto end;
}
+ BT_LOGD("Creating sink component class: "
+ "name=\"%s\", consume-method-addr=%p",
+ name, method);
sink_class = g_new0(struct bt_component_class_sink, 1);
if (!sink_class) {
+ BT_LOGE_STR("Failed to allocate one sink component class.");
goto end;
}
+ /* bt_component_class_init() logs errors */
ret = bt_component_class_init(&sink_class->parent,
BT_COMPONENT_CLASS_TYPE_SINK, name);
if (ret) {
goto end;
}
- sink_class->methods.consume = consume_method;
+ sink_class->methods.consume = method;
+ BT_LOGD("Created sink component class: "
+ "name=\"%s\", consume-method-addr=%p, addr=%p",
+ name, method, &sink_class->parent);
end:
return &sink_class->parent;
int bt_component_class_set_init_method(
struct bt_component_class *component_class,
- bt_component_class_init_method init_method)
+ bt_component_class_init_method method)
{
int ret = 0;
- if (!component_class || component_class->frozen || !init_method) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
- component_class->methods.init = init_method;
+ component_class->methods.init = method;
+ BT_LOGV("Set component class's initialization method: "
+ "addr=%p, name=\"%s\", type=%s, method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type),
+ method);
end:
return ret;
int bt_component_class_set_query_method(
struct bt_component_class *component_class,
- bt_component_class_query_method query_method)
+ bt_component_class_query_method method)
{
int ret = 0;
- if (!component_class || component_class->frozen || !query_method) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
ret = -1;
goto end;
}
- component_class->methods.query = query_method;
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ ret = -1;
+ goto end;
+ }
+
+ component_class->methods.query = method;
+ BT_LOGV("Set component class's query method: "
+ "addr=%p, name=\"%s\", type=%s, method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type),
+ method);
end:
return ret;
{
int ret = 0;
- if (!component_class || component_class->frozen || !method) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
component_class->methods.accept_port_connection = method;
+ BT_LOGV("Set component class's \"accept port connection\" method: "
+ "addr=%p, name=\"%s\", type=%s, method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type),
+ method);
end:
return ret;
{
int ret = 0;
- if (!component_class || component_class->frozen || !method) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
component_class->methods.port_connected = method;
+ BT_LOGV("Set component class's \"port connected\" method: "
+ "addr=%p, name=\"%s\", type=%s, method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type),
+ method);
end:
return ret;
{
int ret = 0;
- if (!component_class || component_class->frozen || !method) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
component_class->methods.port_disconnected = method;
+ BT_LOGV("Set component class's \"port disconnected\" method: "
+ "addr=%p, name=\"%s\", type=%s, method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type),
+ method);
end:
return ret;
int bt_component_class_set_finalize_method(
struct bt_component_class *component_class,
- bt_component_class_finalize_method finalize_method)
+ bt_component_class_finalize_method method)
{
int ret = 0;
- if (!component_class || component_class->frozen || !finalize_method) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
ret = -1;
goto end;
}
- component_class->methods.finalize = finalize_method;
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ ret = -1;
+ goto end;
+ }
+
+ component_class->methods.finalize = method;
+ BT_LOGV("Set component class's finalization method: "
+ "addr=%p, name=\"%s\", type=%s, method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type),
+ method);
end:
return ret;
int bt_component_class_source_set_notification_iterator_init_method(
struct bt_component_class *component_class,
- bt_component_class_notification_iterator_init_method notification_iterator_init_method)
+ bt_component_class_notification_iterator_init_method method)
{
struct bt_component_class_source *source_class;
int ret = 0;
- if (!component_class || component_class->frozen ||
- !notification_iterator_init_method ||
- component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+ BT_LOGW("Invalid parameter: component class is not a source component class: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
source_class = container_of(component_class,
struct bt_component_class_source, parent);
- source_class->methods.iterator.init = notification_iterator_init_method;
+ source_class->methods.iterator.init = method;
+ BT_LOGV("Set filter component class's notification iterator initialization method: "
+ "addr=%p, name=\"%s\", method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ method);
end:
return ret;
int bt_component_class_source_set_notification_iterator_finalize_method(
struct bt_component_class *component_class,
- bt_component_class_notification_iterator_finalize_method notification_iterator_finalize_method)
+ bt_component_class_notification_iterator_finalize_method method)
{
struct bt_component_class_source *source_class;
int ret = 0;
- if (!component_class || component_class->frozen ||
- !notification_iterator_finalize_method ||
- component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
ret = -1;
goto end;
}
- source_class = container_of(component_class,
- struct bt_component_class_source, parent);
- source_class->methods.iterator.finalize =
- notification_iterator_finalize_method;
-
-end:
- return ret;
-}
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
-int bt_component_class_source_set_notification_iterator_seek_time_method(
- struct bt_component_class *component_class,
- bt_component_class_notification_iterator_seek_time_method notification_iterator_seek_time_method)
-{
- struct bt_component_class_source *source_class;
- int ret = 0;
+ if (component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+ BT_LOGW("Invalid parameter: component class is not a source component class: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ ret = -1;
+ goto end;
+ }
- if (!component_class || component_class->frozen ||
- !notification_iterator_seek_time_method ||
- component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
source_class = container_of(component_class,
struct bt_component_class_source, parent);
- source_class->methods.iterator.seek_time =
- notification_iterator_seek_time_method;
+ source_class->methods.iterator.finalize =
+ method;
+ BT_LOGV("Set filter component class's notification iterator finalization method: "
+ "addr=%p, name=\"%s\", method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ method);
end:
return ret;
int bt_component_class_filter_set_notification_iterator_init_method(
struct bt_component_class *component_class,
- bt_component_class_notification_iterator_init_method notification_iterator_init_method)
+ bt_component_class_notification_iterator_init_method method)
{
struct bt_component_class_filter *filter_class;
int ret = 0;
- if (!component_class || component_class->frozen ||
- !notification_iterator_init_method ||
- component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+ BT_LOGW("Invalid parameter: component class is not a filter component class: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
filter_class = container_of(component_class,
struct bt_component_class_filter, parent);
- filter_class->methods.iterator.init = notification_iterator_init_method;
+ filter_class->methods.iterator.init = method;
+ BT_LOGV("Set filter component class's notification iterator initialization method: "
+ "addr=%p, name=\"%s\", method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ method);
end:
return ret;
int bt_component_class_filter_set_notification_iterator_finalize_method(
struct bt_component_class *component_class,
- bt_component_class_notification_iterator_finalize_method notification_iterator_finalize_method)
+ bt_component_class_notification_iterator_finalize_method method)
{
struct bt_component_class_filter *filter_class;
int ret = 0;
- if (!component_class || component_class->frozen ||
- !notification_iterator_finalize_method ||
- component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
ret = -1;
goto end;
}
- filter_class = container_of(component_class,
- struct bt_component_class_filter, parent);
- filter_class->methods.iterator.finalize =
- notification_iterator_finalize_method;
-
-end:
- return ret;
-}
+ if (!method) {
+ BT_LOGW_STR("Invalid parameter: method is NULL.");
+ ret = -1;
+ goto end;
+ }
-int bt_component_class_filter_set_notification_iterator_seek_time_method(
- struct bt_component_class *component_class,
- bt_component_class_notification_iterator_seek_time_method notification_iterator_seek_time_method)
-{
- struct bt_component_class_filter *filter_class;
- int ret = 0;
+ if (component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+ BT_LOGW("Invalid parameter: component class is not a filter component class: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ ret = -1;
+ goto end;
+ }
- if (!component_class || component_class->frozen ||
- !notification_iterator_seek_time_method ||
- component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
filter_class = container_of(component_class,
struct bt_component_class_filter, parent);
- filter_class->methods.iterator.seek_time =
- notification_iterator_seek_time_method;
+ filter_class->methods.iterator.finalize =
+ method;
+ BT_LOGV("Set filter component class's notification iterator finalization method: "
+ "addr=%p, name=\"%s\", method-addr=%p",
+ component_class,
+ bt_component_class_get_name(component_class),
+ method);
end:
return ret;
{
int ret = 0;
- if (!component_class || component_class->frozen || !description) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!description) {
+ BT_LOGW_STR("Invalid parameter: description is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
g_string_assign(component_class->description, description);
+ BT_LOGV("Set component class's description: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
end:
return ret;
{
int ret = 0;
- if (!component_class || component_class->frozen || !help) {
+ if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (!help) {
+ BT_LOGW_STR("Invalid parameter: help is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (component_class->frozen) {
+ BT_LOGW("Invalid parameter: component class is frozen: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
ret = -1;
goto end;
}
g_string_assign(component_class->help, help);
+ BT_LOGV("Set component class's help text: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
end:
return ret;
{
struct bt_component_class_destroy_listener listener;
- assert(class);
- assert(func);
+ BT_ASSERT(class);
+ BT_ASSERT(func);
listener.func = func;
listener.data = data;
g_array_append_val(class->destroy_listeners, listener);
+ BT_LOGV("Component class has no registered query method: "
+ "comp-class-addr=%p, comp-class-name=\"%s\", comp-class-type=%s"
+ "func-addr=%p, data-addr=%p",
+ class,
+ bt_component_class_get_name(class),
+ bt_component_class_type_string(class->type),
+ func, data);
}
int bt_component_class_freeze(
int ret = 0;
if (!component_class) {
+ BT_LOGW_STR("Invalid parameter: component class is NULL.");
ret = -1;
goto end;
}
- component_class->frozen = BT_TRUE;
-
-end:
- return ret;
-}
-
-struct bt_value *bt_component_class_query(
- struct bt_component_class *component_class,
- const char *object, struct bt_value *params)
-{
- struct bt_value *results = NULL;
-
- if (!component_class || !object || !params ||
- !component_class->methods.query) {
+ if (component_class->frozen) {
goto end;
}
- results = component_class->methods.query(component_class,
- object, params);
+ BT_LOGD("Freezing component class: "
+ "addr=%p, name=\"%s\", type=%s",
+ component_class,
+ bt_component_class_get_name(component_class),
+ bt_component_class_type_string(component_class->type));
+ component_class->frozen = BT_TRUE;
end:
- return results;
+ return ret;
}