lib/graph/iterator.c: add logging
[babeltrace.git] / lib / plugin / plugin-so.c
index d5522445464ee2f841dfee5088ca3beac4b49432..4c390b76e53f8d15067876d8c41d6274732d9707 100644 (file)
  * 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>
 
@@ -138,10 +138,24 @@ void bt_plugin_so_shared_lib_handle_destroy(struct bt_object *obj)
        }
 
        if (shared_lib_handle->module) {
-               if (!g_module_close(shared_lib_handle->module)) {
-                       printf_error("Module close error: %s\n",
-                                       g_module_error());
+#ifndef NDEBUG
+               /*
+                * Valgrind shows incomplete stack traces when
+                * dynamically loaded libraries are closed before it
+                * finishes. Use the BABELTRACE_NO_DLCLOSE in a debug
+                * build to avoid this.
+                */
+               const char *var = getenv("BABELTRACE_NO_DLCLOSE");
+
+               if (!var || strcmp(var, "1") != 0) {
+#endif
+                       if (!g_module_close(shared_lib_handle->module)) {
+                               printf_error("Module close error: %s\n",
+                                               g_module_error());
+                       }
+#ifndef NDEBUG
                }
+#endif
        }
 
        if (shared_lib_handle->path) {
@@ -251,9 +265,10 @@ enum bt_plugin_status bt_plugin_so_init(
                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;
        };
@@ -375,9 +390,9 @@ enum bt_plugin_status bt_plugin_so_init(
                                        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 =
@@ -387,6 +402,10 @@ enum bt_plugin_status bt_plugin_so_init(
                                        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;
@@ -395,9 +414,9 @@ enum bt_plugin_status bt_plugin_so_init(
                                        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 =
@@ -426,7 +445,7 @@ enum bt_plugin_status bt_plugin_so_init(
                }
        }
 
-       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++) {
@@ -439,13 +458,11 @@ enum bt_plugin_status bt_plugin_so_init(
                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:
@@ -496,9 +513,9 @@ enum bt_plugin_status bt_plugin_so_init(
                        }
                }
 
-               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);
@@ -526,6 +543,16 @@ enum bt_plugin_status bt_plugin_so_init(
                        }
                }
 
+               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);
@@ -549,10 +576,10 @@ enum bt_plugin_status bt_plugin_so_init(
                                }
                        }
 
-                       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);
@@ -583,10 +610,10 @@ enum bt_plugin_status bt_plugin_so_init(
                                }
                        }
 
-                       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);
@@ -608,7 +635,7 @@ enum bt_plugin_status bt_plugin_so_init(
                case BT_COMPONENT_CLASS_TYPE_SINK:
                        break;
                default:
-                       assert(false);
+                       assert(BT_FALSE);
                        break;
                }
 
@@ -675,7 +702,7 @@ end:
 }
 
 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,
@@ -691,7 +718,7 @@ struct bt_plugin **bt_plugin_so_create_all_from_sections(
        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;
@@ -705,8 +732,8 @@ struct bt_plugin **bt_plugin_so_create_all_from_sections(
                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;
        }
 
@@ -746,24 +773,24 @@ struct bt_plugin **bt_plugin_so_create_all_from_sections(
                        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);
 
@@ -771,7 +798,7 @@ struct bt_plugin **bt_plugin_so_create_all_from_static(void)
                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),
@@ -784,14 +811,14 @@ struct bt_plugin **bt_plugin_so_create_all_from_static(void)
 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;
@@ -800,7 +827,7 @@ struct bt_plugin **bt_plugin_so_create_all_from_file(const char *path)
        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) {
@@ -910,14 +937,14 @@ struct bt_plugin **bt_plugin_so_create_all_from_file(const char *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
@@ -930,10 +957,9 @@ void plugin_comp_class_destroy_listener(struct bt_component_class *comp_class,
 }
 
 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);
@@ -944,18 +970,6 @@ int bt_plugin_so_on_add_component_class(struct bt_plugin *plugin,
                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;
 }
This page took 0.03195 seconds and 4 git commands to generate.