#include "component-class.h"
#include "lib/func-status.h"
+#include "lib/graph/message-iterator-class.h"
#define BT_ASSERT_PRE_DEV_COMP_CLS_HOT(_cc) \
BT_ASSERT_PRE_DEV_HOT(((const struct bt_component_class *) (_cc)), \
class->destroy_listeners = NULL;
}
+ if (bt_component_class_has_message_iterator_class(class)) {
+ struct bt_component_class_with_iterator_class *class_with_iter_class =
+ container_of(class, struct bt_component_class_with_iterator_class, parent);
+
+ BT_ASSERT(class_with_iter_class->msg_iter_cls);
+ bt_message_iterator_class_put_ref(class_with_iter_class->msg_iter_cls);
+ class_with_iter_class->msg_iter_cls = NULL;
+ }
+
g_free(class);
}
return ret;
}
+static
+int bt_component_class_with_iterator_class_init(
+ struct bt_component_class_with_iterator_class *class,
+ enum bt_component_class_type type, const char *name,
+ struct bt_message_iterator_class *message_iterator_class)
+{
+ int ret;
+
+ ret = bt_component_class_init(&class->parent, type, name);
+ if (ret != 0) {
+ goto end;
+ }
+
+ class->msg_iter_cls = message_iterator_class;
+ bt_message_iterator_class_get_ref(class->msg_iter_cls);
+ bt_message_iterator_class_freeze(class->msg_iter_cls);
+
+end:
+ return ret;
+}
+
struct bt_component_class_source *bt_component_class_source_create(
const char *name,
- bt_component_class_source_message_iterator_next_method method)
+ struct bt_message_iterator_class *message_iterator_class)
{
struct bt_component_class_source *source_class = NULL;
int ret;
BT_ASSERT_PRE_NO_ERROR();
BT_ASSERT_PRE_NON_NULL(name, "Name");
- BT_ASSERT_PRE_NON_NULL(method, "Message iterator next method");
- BT_LOGI("Creating source component class: "
- "name=\"%s\", msg-iter-next-method-addr=%p",
- name, method);
+ BT_ASSERT_PRE_NON_NULL(message_iterator_class, "Message iterator class");
+ BT_LIB_LOGI("Creating source component class: "
+ "name=\"%s\", %![msg-iter-cls-]+I",
+ name, message_iterator_class);
source_class = g_new0(struct bt_component_class_source, 1);
if (!source_class) {
BT_LIB_LOGE_APPEND_CAUSE(
}
/* bt_component_class_init() logs errors */
- ret = bt_component_class_init(&source_class->parent,
- BT_COMPONENT_CLASS_TYPE_SOURCE, name);
+ ret = bt_component_class_with_iterator_class_init(&source_class->parent,
+ BT_COMPONENT_CLASS_TYPE_SOURCE, name, message_iterator_class);
if (ret) {
/*
* If bt_component_class_init() fails, the component
goto end;
}
- source_class->methods.msg_iter_next = method;
BT_LIB_LOGI("Created source component class: %!+C", source_class);
end:
struct bt_component_class_filter *bt_component_class_filter_create(
const char *name,
- bt_component_class_filter_message_iterator_next_method method)
+ struct bt_message_iterator_class *message_iterator_class)
{
struct bt_component_class_filter *filter_class = NULL;
int ret;
BT_ASSERT_PRE_NO_ERROR();
BT_ASSERT_PRE_NON_NULL(name, "Name");
- BT_ASSERT_PRE_NON_NULL(method, "Message iterator next method");
- BT_LOGI("Creating filter component class: "
- "name=\"%s\", msg-iter-next-method-addr=%p",
- name, method);
+ BT_ASSERT_PRE_NON_NULL(message_iterator_class, "Message iterator class");
+ BT_LIB_LOGI("Creating filter component class: "
+ "name=\"%s\", %![msg-iter-cls-]+I",
+ name, message_iterator_class);
filter_class = g_new0(struct bt_component_class_filter, 1);
if (!filter_class) {
BT_LIB_LOGE_APPEND_CAUSE(
}
/* bt_component_class_init() logs errors */
- ret = bt_component_class_init(&filter_class->parent,
- BT_COMPONENT_CLASS_TYPE_FILTER, name);
+ ret = bt_component_class_with_iterator_class_init(&filter_class->parent,
+ BT_COMPONENT_CLASS_TYPE_FILTER, name, message_iterator_class);
if (ret) {
/*
* If bt_component_class_init() fails, the component
goto end;
}
- filter_class->methods.msg_iter_next = method;
BT_LIB_LOGI("Created filter component class: %!+C", filter_class);
end:
return BT_FUNC_STATUS_OK;
}
-enum bt_component_class_set_method_status
-bt_component_class_source_set_message_iterator_initialize_method(
- struct bt_component_class_source *comp_cls,
- bt_component_class_source_message_iterator_initialize_method method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(method, "Method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_initialize = method;
- BT_LIB_LOGD("Set source component class's message iterator initialization method"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_filter_set_message_iterator_initialize_method(
- struct bt_component_class_filter *comp_cls,
- bt_component_class_filter_message_iterator_initialize_method method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(method, "Method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_initialize = method;
- BT_LIB_LOGD("Set filter component class's message iterator initialization method"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_source_set_message_iterator_finalize_method(
- struct bt_component_class_source *comp_cls,
- bt_component_class_source_message_iterator_finalize_method method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(method, "Method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_finalize = method;
- BT_LIB_LOGD("Set source component class's message iterator finalization method"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_filter_set_message_iterator_finalize_method(
- struct bt_component_class_filter *comp_cls,
- bt_component_class_filter_message_iterator_finalize_method method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(method, "Method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_finalize = method;
- BT_LIB_LOGD("Set filter component class's message iterator finalization method"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_filter_set_message_iterator_seek_ns_from_origin_methods(
- struct bt_component_class_filter *comp_cls,
- bt_component_class_filter_message_iterator_seek_ns_from_origin_method seek_method,
- bt_component_class_filter_message_iterator_can_seek_ns_from_origin_method can_seek_method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(seek_method, "Seek method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_seek_ns_from_origin = seek_method;
- comp_cls->methods.msg_iter_can_seek_ns_from_origin = can_seek_method;
- BT_LIB_LOGD("Set filter component class's message iterator \"seek nanoseconds from origin\" method"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_source_set_message_iterator_seek_ns_from_origin_methods(
- struct bt_component_class_source *comp_cls,
- bt_component_class_source_message_iterator_seek_ns_from_origin_method seek_method,
- bt_component_class_source_message_iterator_can_seek_ns_from_origin_method can_seek_method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(seek_method, "Seek method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_seek_ns_from_origin = seek_method;
- comp_cls->methods.msg_iter_can_seek_ns_from_origin = can_seek_method;
- BT_LIB_LOGD("Set source component class's message iterator \"seek nanoseconds from origin\" methods"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_filter_set_message_iterator_seek_beginning_methods(
- struct bt_component_class_filter *comp_cls,
- bt_component_class_filter_message_iterator_seek_beginning_method seek_method,
- bt_component_class_filter_message_iterator_can_seek_beginning_method can_seek_method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(seek_method, "Seek method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_seek_beginning = seek_method;
- comp_cls->methods.msg_iter_can_seek_beginning = can_seek_method;
- BT_LIB_LOGD("Set filter component class's message iterator \"seek beginning\" methods"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
-enum bt_component_class_set_method_status
-bt_component_class_source_set_message_iterator_seek_beginning_methods(
- struct bt_component_class_source *comp_cls,
- bt_component_class_source_message_iterator_seek_beginning_method seek_method,
- bt_component_class_source_message_iterator_can_seek_beginning_method can_seek_method)
-{
- BT_ASSERT_PRE_NO_ERROR();
- BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
- BT_ASSERT_PRE_NON_NULL(seek_method, "Seek method");
- BT_ASSERT_PRE_DEV_COMP_CLS_HOT(comp_cls);
- comp_cls->methods.msg_iter_seek_beginning = seek_method;
- comp_cls->methods.msg_iter_can_seek_beginning = can_seek_method;
- BT_LIB_LOGD("Set source component class's message iterator \"seek beginning\" methods"
- ": %!+C", comp_cls);
- return BT_FUNC_STATUS_OK;
-}
-
enum bt_component_class_set_description_status
bt_component_class_set_description(
struct bt_component_class *comp_cls,