lib/graph/iterator.c: add logging
[babeltrace.git] / lib / plugin / plugin-so.c
index 6760aa758159db7dd911d435257dbf6cb807baed..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) {
@@ -188,7 +202,7 @@ end:
        return shared_lib_handle;
 }
 
-BT_HIDDEN
+static
 void bt_plugin_so_destroy_spec_data(struct bt_plugin *plugin)
 {
        struct bt_plugin_so_spec_data *spec = plugin->spec_data;
@@ -249,10 +263,13 @@ enum bt_plugin_status bt_plugin_so_init(
        struct comp_class_full_descriptor {
                const struct __bt_plugin_component_class_descriptor *descriptor;
                const char *description;
+               const char *help;
                bt_component_class_init_method init_method;
-               bt_component_class_destroy_method destroy_method;
-               bt_component_class_filter_add_iterator_method filter_add_iterator_method;
-               bt_component_class_sink_add_iterator_method sink_add_iterator_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;
        };
 
@@ -365,29 +382,41 @@ enum bt_plugin_status bt_plugin_so_init(
                                        cc_full_descr->description =
                                                cur_cc_descr_attr->value.description;
                                        break;
+                               case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_HELP:
+                                       cc_full_descr->help =
+                                               cur_cc_descr_attr->value.help;
+                                       break;
                                case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_INIT_METHOD:
                                        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 =
+                                               cur_cc_descr_attr->value.query_method;
+                                       break;
+                               case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_ACCEPT_PORT_CONNECTION_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_FILTER_ADD_ITERATOR_METHOD:
-                                       cc_full_descr->filter_add_iterator_method =
-                                               cur_cc_descr_attr->value.filter_add_iterator_method;
+                               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_SINK_ADD_ITERATOR_METHOD:
-                                       cc_full_descr->sink_add_iterator_method =
-                                               cur_cc_descr_attr->value.sink_add_iterator_method;
+                               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;
                                        break;
                                case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_NOTIF_ITER_INIT_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 =
@@ -416,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++) {
@@ -429,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:
@@ -466,6 +493,16 @@ enum bt_plugin_status bt_plugin_so_init(
                        }
                }
 
+               if (cc_full_descr->help) {
+                       ret = bt_component_class_set_help(comp_class,
+                               cc_full_descr->help);
+                       if (ret) {
+                               status = BT_PLUGIN_STATUS_ERROR;
+                               BT_PUT(comp_class);
+                               goto end;
+                       }
+               }
+
                if (cc_full_descr->init_method) {
                        ret = bt_component_class_set_init_method(comp_class,
                                cc_full_descr->init_method);
@@ -476,9 +513,49 @@ 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);
+                               goto end;
+                       }
+               }
+
+               if (cc_full_descr->query_method) {
+                       ret = bt_component_class_set_query_method(
+                               comp_class, cc_full_descr->query_method);
+                       if (ret) {
+                               status = BT_PLUGIN_STATUS_ERROR;
+                               BT_PUT(comp_class);
+                               goto end;
+                       }
+               }
+
+               if (cc_full_descr->accept_port_connection_method) {
+                       ret = bt_component_class_set_accept_port_connection_method(
+                               comp_class, cc_full_descr->accept_port_connection_method);
+                       if (ret) {
+                               status = BT_PLUGIN_STATUS_ERROR;
+                               BT_PUT(comp_class);
+                               goto end;
+                       }
+               }
+
+               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 (ret) {
                                status = BT_PLUGIN_STATUS_ERROR;
                                BT_PUT(comp_class);
@@ -499,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);
@@ -522,17 +599,6 @@ enum bt_plugin_status bt_plugin_so_init(
                        }
                        break;
                case BT_COMPONENT_CLASS_TYPE_FILTER:
-                       if (cc_full_descr->filter_add_iterator_method) {
-                               ret = bt_component_class_filter_set_add_iterator_method(
-                                       comp_class,
-                                       cc_full_descr->filter_add_iterator_method);
-                               if (ret) {
-                                       status = BT_PLUGIN_STATUS_ERROR;
-                                       BT_PUT(comp_class);
-                                       goto end;
-                               }
-                       }
-
                        if (cc_full_descr->iterator_methods.init) {
                                ret = bt_component_class_filter_set_notification_iterator_init_method(
                                        comp_class,
@@ -544,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);
@@ -567,19 +633,9 @@ enum bt_plugin_status bt_plugin_so_init(
                        }
                        break;
                case BT_COMPONENT_CLASS_TYPE_SINK:
-                       if (cc_full_descr->sink_add_iterator_method) {
-                               ret = bt_component_class_sink_set_add_iterator_method(
-                                       comp_class,
-                                       cc_full_descr->sink_add_iterator_method);
-                               if (ret) {
-                                       status = BT_PLUGIN_STATUS_ERROR;
-                                       BT_PUT(comp_class);
-                                       goto end;
-                               }
-                       }
                        break;
                default:
-                       assert(false);
+                       assert(BT_FALSE);
                        break;
                }
 
@@ -628,6 +684,7 @@ struct bt_plugin *bt_plugin_so_create_empty(
                goto error;
        }
 
+       plugin->destroy_spec_data = bt_plugin_so_destroy_spec_data;
        plugin->spec_data = g_new0(struct bt_plugin_so_spec_data, 1);
        if (!plugin->spec_data) {
                goto error;
@@ -645,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,
@@ -661,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;
@@ -675,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;
        }
 
@@ -716,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);
 
@@ -741,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),
@@ -754,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;
@@ -770,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) {
@@ -880,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
@@ -900,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);
@@ -914,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.029402 seconds and 4 git commands to generate.