lib/graph/iterator.c: add logging
[babeltrace.git] / lib / plugin / plugin-so.c
index 2e528ea063d7943f6416c97ae7e66a21130df452..4c390b76e53f8d15067876d8c41d6274732d9707 100644 (file)
@@ -34,8 +34,8 @@
 #include <babeltrace/plugin/plugin-dev.h>
 #include <babeltrace/plugin/plugin-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) {
@@ -254,6 +268,7 @@ enum bt_plugin_status bt_plugin_so_init(
                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;
        };
@@ -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;
@@ -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++) {
@@ -524,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);
@@ -606,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;
                }
 
@@ -673,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,
@@ -689,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;
@@ -703,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;
        }
 
@@ -744,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);
 
@@ -769,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),
@@ -782,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;
@@ -798,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) {
@@ -908,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
@@ -928,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);
@@ -942,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.026662 seconds and 4 git commands to generate.