Notification iterator: generate automatic notifications when missing
[babeltrace.git] / lib / plugin / plugin-so.c
index 24478f1fc761ab9f02ae8c4b0e9c12d0f7f36665..771937ed8782a57d4c07a9dddd5103c176da4c38 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 <string.h>
 #include <stdbool.h>
 #include <glib.h>
@@ -188,7 +188,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;
@@ -251,9 +251,11 @@ 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_new_connection_method new_connection_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;
        };
 
@@ -374,25 +376,33 @@ 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 =
                                                cur_cc_descr_attr->value.query_method;
                                        break;
-                               case BT_PLUGIN_COMPONENT_CLASS_DESCRIPTOR_ATTRIBUTE_TYPE_NEW_CONNECTION_METHOD:
-                                       cc_full_descr->new_connection_method =
-                                               cur_cc_descr_attr->value.new_connection_method;
+                               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_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;
                                        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 =
@@ -434,13 +444,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:
@@ -491,9 +499,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);
@@ -511,9 +519,29 @@ enum bt_plugin_status bt_plugin_so_init(
                        }
                }
 
-               if (cc_full_descr->new_connection_method) {
-                       ret = bt_component_class_set_new_connection_method(
-                               comp_class, cc_full_descr->new_connection_method);
+               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);
@@ -534,10 +562,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);
@@ -568,10 +596,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);
@@ -642,6 +670,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;
@@ -914,10 +943,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);
@@ -928,18 +956,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.027112 seconds and 4 git commands to generate.