* SOFTWARE.
*/
-#include <babeltrace/compiler.h>
+#include <babeltrace/compiler-internal.h>
#include <babeltrace/ref.h>
#include <babeltrace/plugin/plugin-internal.h>
#include <babeltrace/plugin/plugin-so-internal.h>
#include <babeltrace/plugin/plugin-dev.h>
#include <babeltrace/plugin/plugin-internal.h>
-#include <babeltrace/component/component-class-internal.h>
+#include <babeltrace/graph/component-class-internal.h>
+#include <babeltrace/types.h>
#include <string.h>
-#include <stdbool.h>
#include <glib.h>
#include <gmodule.h>
const char *description;
const char *help;
bt_component_class_init_method init_method;
- bt_component_class_destroy_method destroy_method;
+ bt_component_class_finalize_method finalize_method;
bt_component_class_query_method query_method;
bt_component_class_accept_port_connection_method accept_port_connection_method;
+ bt_component_class_port_connected_method port_connected_method;
bt_component_class_port_disconnected_method port_disconnected_method;
struct bt_component_class_iterator_methods iterator_methods;
};
cc_full_descr->init_method =
cur_cc_descr_attr->value.init_method;
break;
- case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_DESTROY_METHOD:
- cc_full_descr->destroy_method =
- cur_cc_descr_attr->value.destroy_method;
+ case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_FINALIZE_METHOD:
+ cc_full_descr->finalize_method =
+ cur_cc_descr_attr->value.finalize_method;
break;
case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_QUERY_METHOD:
cc_full_descr->query_method =
cc_full_descr->accept_port_connection_method =
cur_cc_descr_attr->value.accept_port_connection_method;
break;
+ case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_PORT_CONNECTED_METHOD:
+ cc_full_descr->port_connected_method =
+ cur_cc_descr_attr->value.port_connected_method;
+ break;
case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_PORT_DISCONNECTED_METHOD:
cc_full_descr->port_disconnected_method =
cur_cc_descr_attr->value.port_disconnected_method;
cc_full_descr->iterator_methods.init =
cur_cc_descr_attr->value.notif_iter_init_method;
break;
- case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_NOTIF_ITER_DESTROY_METHOD:
- cc_full_descr->iterator_methods.destroy =
- cur_cc_descr_attr->value.notif_iter_destroy_method;
+ case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_NOTIF_ITER_FINALIZE_METHOD:
+ cc_full_descr->iterator_methods.finalize =
+ cur_cc_descr_attr->value.notif_iter_finalize_method;
break;
case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_NOTIF_ITER_SEEK_TIME_METHOD:
cc_full_descr->iterator_methods.seek_time =
}
}
- spec->shared_lib_handle->init_called = true;
+ spec->shared_lib_handle->init_called = BT_TRUE;
/* Add described component classes to plugin */
for (i = 0; i < comp_class_full_descriptors->len; i++) {
case BT_COMPONENT_CLASS_TYPE_SOURCE:
comp_class = bt_component_class_source_create(
cc_full_descr->descriptor->name,
- cc_full_descr->descriptor->methods.source.notif_iter_get,
cc_full_descr->descriptor->methods.source.notif_iter_next);
break;
case BT_COMPONENT_CLASS_TYPE_FILTER:
comp_class = bt_component_class_filter_create(
cc_full_descr->descriptor->name,
- cc_full_descr->descriptor->methods.source.notif_iter_get,
cc_full_descr->descriptor->methods.source.notif_iter_next);
break;
case BT_COMPONENT_CLASS_TYPE_SINK:
}
}
- if (cc_full_descr->destroy_method) {
- ret = bt_component_class_set_destroy_method(comp_class,
- cc_full_descr->destroy_method);
+ if (cc_full_descr->finalize_method) {
+ ret = bt_component_class_set_finalize_method(comp_class,
+ cc_full_descr->finalize_method);
if (ret) {
status = BT_PLUGIN_STATUS_ERROR;
BT_PUT(comp_class);
}
}
+ if (cc_full_descr->port_connected_method) {
+ ret = bt_component_class_set_port_connected_method(
+ comp_class, cc_full_descr->port_connected_method);
+ if (ret) {
+ status = BT_PLUGIN_STATUS_ERROR;
+ BT_PUT(comp_class);
+ goto end;
+ }
+ }
+
if (cc_full_descr->port_disconnected_method) {
ret = bt_component_class_set_port_disconnected_method(
comp_class, cc_full_descr->port_disconnected_method);
}
}
- if (cc_full_descr->iterator_methods.destroy) {
- ret = bt_component_class_source_set_notification_iterator_destroy_method(
+ if (cc_full_descr->iterator_methods.finalize) {
+ ret = bt_component_class_source_set_notification_iterator_finalize_method(
comp_class,
- cc_full_descr->iterator_methods.destroy);
+ cc_full_descr->iterator_methods.finalize);
if (ret) {
status = BT_PLUGIN_STATUS_ERROR;
BT_PUT(comp_class);
}
}
- if (cc_full_descr->iterator_methods.destroy) {
- ret = bt_component_class_filter_set_notification_iterator_destroy_method(
+ if (cc_full_descr->iterator_methods.finalize) {
+ ret = bt_component_class_filter_set_notification_iterator_finalize_method(
comp_class,
- cc_full_descr->iterator_methods.destroy);
+ cc_full_descr->iterator_methods.finalize);
if (ret) {
status = BT_PLUGIN_STATUS_ERROR;
BT_PUT(comp_class);
case BT_COMPONENT_CLASS_TYPE_SINK:
break;
default:
- assert(false);
+ assert(BT_FALSE);
break;
}
}
static
-struct bt_plugin **bt_plugin_so_create_all_from_sections(
+struct bt_plugin_set *bt_plugin_so_create_all_from_sections(
struct bt_plugin_so_shared_lib_handle *shared_lib_handle,
struct __bt_plugin_descriptor const * const *descriptors_begin,
struct __bt_plugin_descriptor const * const *descriptors_end,
size_t cc_descriptors_count;
size_t cc_descr_attrs_count;
size_t i;
- struct bt_plugin **plugins = NULL;
+ struct bt_plugin_set *plugin_set = NULL;
descriptor_count = descriptors_end - descriptors_begin;
attrs_count = attrs_end - attrs_begin;
cc_descriptors_begin, cc_descriptors_end, cc_descriptors_count);
printf_verbose("Section: Plugin component class descriptor attributes: [%p - %p], (%zu elements)\n",
cc_descr_attrs_begin, cc_descr_attrs_end, cc_descr_attrs_count);
- plugins = calloc(descriptor_count + 1, sizeof(*plugins));
- if (!plugins) {
+ plugin_set = bt_plugin_set_create();
+ if (!plugin_set) {
goto error;
}
goto error;
}
- /* Transfer ownership to the array */
- plugins[i] = plugin;
+ /* Add to plugin set */
+ bt_plugin_set_add_plugin(plugin_set, plugin);
+ bt_put(plugin);
}
goto end;
error:
- g_free(plugins);
- plugins = NULL;
+ BT_PUT(plugin_set);
end:
- return plugins;
+ return plugin_set;
}
BT_HIDDEN
-struct bt_plugin **bt_plugin_so_create_all_from_static(void)
+struct bt_plugin_set *bt_plugin_so_create_all_from_static(void)
{
- struct bt_plugin **plugins = NULL;
+ struct bt_plugin_set *plugin_set = NULL;
struct bt_plugin_so_shared_lib_handle *shared_lib_handle =
bt_plugin_so_shared_lib_handle_create(NULL);
goto end;
}
- plugins = bt_plugin_so_create_all_from_sections(shared_lib_handle,
+ plugin_set = bt_plugin_so_create_all_from_sections(shared_lib_handle,
SECTION_BEGIN(__bt_plugin_descriptors),
SECTION_END(__bt_plugin_descriptors),
SECTION_BEGIN(__bt_plugin_descriptor_attributes),
end:
BT_PUT(shared_lib_handle);
- return plugins;
+ return plugin_set;
}
BT_HIDDEN
-struct bt_plugin **bt_plugin_so_create_all_from_file(const char *path)
+struct bt_plugin_set *bt_plugin_so_create_all_from_file(const char *path)
{
size_t path_len;
- struct bt_plugin **plugins = NULL;
+ struct bt_plugin_set *plugin_set = NULL;
struct __bt_plugin_descriptor const * const *descriptors_begin = NULL;
struct __bt_plugin_descriptor const * const *descriptors_end = NULL;
struct __bt_plugin_descriptor_attribute const * const *attrs_begin = NULL;
struct __bt_plugin_component_class_descriptor const * const *cc_descriptors_end = NULL;
struct __bt_plugin_component_class_descriptor_attribute const * const *cc_descr_attrs_begin = NULL;
struct __bt_plugin_component_class_descriptor_attribute const * const *cc_descr_attrs_end = NULL;
- bool is_libtool_wrapper = false, is_shared_object = false;
+ bt_bool is_libtool_wrapper = BT_FALSE, is_shared_object = BT_FALSE;
struct bt_plugin_so_shared_lib_handle *shared_lib_handle = NULL;
if (!path) {
}
/* Initialize plugin */
- plugins = bt_plugin_so_create_all_from_sections(shared_lib_handle,
+ plugin_set = bt_plugin_so_create_all_from_sections(shared_lib_handle,
descriptors_begin, descriptors_end, attrs_begin, attrs_end,
cc_descriptors_begin, cc_descriptors_end,
cc_descr_attrs_begin, cc_descr_attrs_end);
end:
BT_PUT(shared_lib_handle);
- return plugins;
+ return plugin_set;
}
static
}
BT_HIDDEN
-int bt_plugin_so_on_add_component_class(struct bt_plugin *plugin,
+void bt_plugin_so_on_add_component_class(struct bt_plugin *plugin,
struct bt_component_class *comp_class)
{
- int ret;
struct bt_plugin_so_spec_data *spec = plugin->spec_data;
assert(plugin->spec_data);
bt_get(spec->shared_lib_handle));
/* Add our custom destroy listener */
- ret = bt_component_class_add_destroy_listener(comp_class,
+ bt_component_class_add_destroy_listener(comp_class,
plugin_comp_class_destroy_listener, NULL);
- if (ret) {
- goto error;
- }
- goto end;
-
-error:
- /* Remove entry from global hash table (if exists) */
- g_hash_table_remove(comp_classes_to_shlib_handles,
- comp_class);
-
-end:
- return ret;
}