X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fplugin%2Fplugin-internal.h;h=781c4ef3b5ba8955c835ae217048ae5c03c7973a;hb=7e69c04f557e46fb50e5a888a3bc3451afbd3b8e;hp=cbcf0274ca3ce71bc6db15c976093e717768a4a5;hpb=f6ccaed94e575af57fe6bf38154771bee4871a2a;p=babeltrace.git diff --git a/include/babeltrace/plugin/plugin-internal.h b/include/babeltrace/plugin/plugin-internal.h index cbcf0274..781c4ef3 100644 --- a/include/babeltrace/plugin/plugin-internal.h +++ b/include/babeltrace/plugin/plugin-internal.h @@ -2,12 +2,9 @@ #define BABELTRACE_PLUGIN_PLUGIN_INTERNAL_H /* - * BabelTrace - Plug-in Internal - * + * Copyright 2017-2018 Philippe Proulx * Copyright 2015 Jérémie Galarneau * - * Author: Jérémie Galarneau - * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights @@ -28,11 +25,14 @@ */ #include -#include +#include +#include #include +#include #include #include #include +#include #include enum bt_plugin_type { @@ -40,13 +40,20 @@ enum bt_plugin_type { BT_PLUGIN_TYPE_PYTHON = 1, }; +enum bt_plugin_status { + BT_PLUGIN_STATUS_OK = 0, + BT_PLUGIN_STATUS_ERROR = -1, + BT_PLUGIN_STATUS_NOMEM = -12, +}; + struct bt_plugin { struct bt_object base; enum bt_plugin_type type; - bt_bool frozen; - /* Array of pointers to bt_component_class (owned by this) */ - GPtrArray *comp_classes; + /* Arrays of `struct bt_component_class *` (owned by this) */ + GPtrArray *src_comp_classes; + GPtrArray *flt_comp_classes; + GPtrArray *sink_comp_classes; /* Info (owned by this) */ struct { @@ -61,12 +68,12 @@ struct bt_plugin { unsigned int patch; GString *extra; } version; - bt_bool path_set; - bt_bool name_set; - bt_bool author_set; - bt_bool license_set; - bt_bool description_set; - bt_bool version_set; + bool path_set; + bool name_set; + bool author_set; + bool license_set; + bool description_set; + bool version_set; } info; /* Value depends on the specific plugin type */ @@ -116,40 +123,58 @@ void bt_plugin_destroy(struct bt_object *obj) BT_ASSERT(obj); plugin = container_of(obj, struct bt_plugin, base); - BT_LOGD("Destroying plugin object: addr=%p, name=\"%s\"", - plugin, plugin->info.name ? plugin->info.name->str : NULL); + BT_LIB_LOGD("Destroying plugin object: %!+l", plugin); if (plugin->destroy_spec_data) { plugin->destroy_spec_data(plugin); } - if (plugin->comp_classes) { - BT_LOGD_STR("Putting component classes."); - g_ptr_array_free(plugin->comp_classes, TRUE); + if (plugin->src_comp_classes) { + BT_LOGD_STR("Putting source component classes."); + g_ptr_array_free(plugin->src_comp_classes, TRUE); + plugin->src_comp_classes = NULL; + } + + if (plugin->flt_comp_classes) { + BT_LOGD_STR("Putting filter component classes."); + g_ptr_array_free(plugin->flt_comp_classes, TRUE); + plugin->flt_comp_classes = NULL; + } + + if (plugin->sink_comp_classes) { + BT_LOGD_STR("Putting sink component classes."); + g_ptr_array_free(plugin->sink_comp_classes, TRUE); + plugin->sink_comp_classes = NULL; } if (plugin->info.name) { g_string_free(plugin->info.name, TRUE); + plugin->info.name = NULL; } if (plugin->info.path) { g_string_free(plugin->info.path, TRUE); + plugin->info.path = NULL; } if (plugin->info.description) { g_string_free(plugin->info.description, TRUE); + plugin->info.description = NULL; } if (plugin->info.author) { g_string_free(plugin->info.author, TRUE); + plugin->info.author = NULL; } if (plugin->info.license) { g_string_free(plugin->info.license, TRUE); + plugin->info.license = NULL; } if (plugin->info.version.extra) { g_string_free(plugin->info.version.extra, TRUE); + plugin->info.version.extra = NULL; } g_free(plugin); @@ -169,13 +194,30 @@ struct bt_plugin *bt_plugin_create_empty(enum bt_plugin_type type) goto error; } - bt_object_init(plugin, bt_plugin_destroy); + bt_object_init_shared(&plugin->base, bt_plugin_destroy); plugin->type = type; - /* Create empty array of component classes */ - plugin->comp_classes = - g_ptr_array_new_with_free_func((GDestroyNotify) bt_put); - if (!plugin->comp_classes) { + /* Create empty arrays of component classes */ + plugin->src_comp_classes = + g_ptr_array_new_with_free_func( + (GDestroyNotify) bt_object_put_ref); + if (!plugin->src_comp_classes) { + BT_LOGE_STR("Failed to allocate a GPtrArray."); + goto error; + } + + plugin->flt_comp_classes = + g_ptr_array_new_with_free_func( + (GDestroyNotify) bt_object_put_ref); + if (!plugin->flt_comp_classes) { + BT_LOGE_STR("Failed to allocate a GPtrArray."); + goto error; + } + + plugin->sink_comp_classes = + g_ptr_array_new_with_free_func( + (GDestroyNotify) bt_object_put_ref); + if (!plugin->sink_comp_classes) { BT_LOGE_STR("Failed to allocate a GPtrArray."); goto error; } @@ -217,12 +259,11 @@ struct bt_plugin *bt_plugin_create_empty(enum bt_plugin_type type) goto error; } - BT_LOGD("Created empty plugin object: type=%s, addr=%p", - bt_plugin_type_string(type), plugin); + BT_LIB_LOGD("Created empty plugin object: %!+l", plugin); goto end; error: - BT_PUT(plugin); + BT_OBJECT_PUT_REF_AND_RESET(plugin); end: return plugin; @@ -235,8 +276,8 @@ void bt_plugin_set_path(struct bt_plugin *plugin, const char *path) BT_ASSERT(path); g_string_assign(plugin->info.path, path); plugin->info.path_set = BT_TRUE; - BT_LOGV("Set plugin's path: addr=%p, name=\"%s\", path=\"%s\"", - plugin, bt_plugin_get_name(plugin), path); + BT_LIB_LOGV("Set plugin's path: %![plugin-]+l, path=\"%s\"", + plugin, path); } static inline @@ -246,7 +287,7 @@ void bt_plugin_set_name(struct bt_plugin *plugin, const char *name) BT_ASSERT(name); g_string_assign(plugin->info.name, name); plugin->info.name_set = BT_TRUE; - BT_LOGV("Set plugin's name: addr=%p, name=\"%s\"", + BT_LIB_LOGV("Set plugin's name: %![plugin-]+l, name=\"%s\"", plugin, name); } @@ -258,8 +299,7 @@ void bt_plugin_set_description(struct bt_plugin *plugin, BT_ASSERT(description); g_string_assign(plugin->info.description, description); plugin->info.description_set = BT_TRUE; - BT_LOGV("Set plugin's description: addr=%p, name=\"%s\"", - plugin, bt_plugin_get_name(plugin)); + BT_LIB_LOGV("Set plugin's description: %![plugin-]+l", plugin); } static inline @@ -269,8 +309,8 @@ void bt_plugin_set_author(struct bt_plugin *plugin, const char *author) BT_ASSERT(author); g_string_assign(plugin->info.author, author); plugin->info.author_set = BT_TRUE; - BT_LOGV("Set plugin's author: addr=%p, name=\"%s\", author=\"%s\"", - plugin, bt_plugin_get_name(plugin), author); + BT_LIB_LOGV("Set plugin's author: %![plugin-]+l, author=\"%s\"", + plugin, author); } static inline @@ -280,8 +320,8 @@ void bt_plugin_set_license(struct bt_plugin *plugin, const char *license) BT_ASSERT(license); g_string_assign(plugin->info.license, license); plugin->info.license_set = BT_TRUE; - BT_LOGV("Set plugin's path: addr=%p, name=\"%s\", license=\"%s\"", - plugin, bt_plugin_get_name(plugin), license); + BT_LIB_LOGV("Set plugin's path: %![plugin-]+l, license=\"%s\"", + plugin, license); } static inline @@ -298,25 +338,46 @@ void bt_plugin_set_version(struct bt_plugin *plugin, unsigned int major, } plugin->info.version_set = BT_TRUE; - BT_LOGV("Set plugin's version: addr=%p, name=\"%s\", " + BT_LIB_LOGV("Set plugin's version: %![plugin-]+l, " "major=%u, minor=%u, patch=%u, extra=\"%s\"", - plugin, bt_plugin_get_name(plugin), - major, minor, patch, extra); + plugin, major, minor, patch, extra); } static inline -void bt_plugin_freeze(struct bt_plugin *plugin) +enum bt_plugin_status bt_plugin_add_component_class( + struct bt_plugin *plugin, struct bt_component_class *comp_class) { + GPtrArray *comp_classes; + BT_ASSERT(plugin); + BT_ASSERT(comp_class); + + switch (comp_class->type) { + case BT_COMPONENT_CLASS_TYPE_SOURCE: + comp_classes = plugin->src_comp_classes; + break; + case BT_COMPONENT_CLASS_TYPE_FILTER: + comp_classes = plugin->flt_comp_classes; + break; + case BT_COMPONENT_CLASS_TYPE_SINK: + comp_classes = plugin->sink_comp_classes; + break; + default: + abort(); + } - if (plugin->frozen) { - return; + /* Add new component class */ + bt_object_get_ref(comp_class); + g_ptr_array_add(comp_classes, comp_class); + + /* Special case for a shared object plugin */ + if (plugin->type == BT_PLUGIN_TYPE_SO) { + bt_plugin_so_on_add_component_class(plugin, comp_class); } - BT_LOGD("Freezing plugin: addr=%p, name=\"%s\", path=\"%s\"", - plugin, bt_plugin_get_name(plugin), - bt_plugin_get_path(plugin)); - plugin->frozen = BT_TRUE; + BT_LIB_LOGD("Added component class to plugin: " + "%![plugin-]+l, %![cc-]+C", plugin, comp_class); + return BT_PLUGIN_STATUS_OK; } static @@ -349,13 +410,13 @@ struct bt_plugin_set *bt_plugin_set_create(void) } BT_LOGD_STR("Creating empty plugin set."); - bt_object_init(plugin_set, bt_plugin_set_destroy); + bt_object_init_shared(&plugin_set->base, bt_plugin_set_destroy); plugin_set->plugins = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_put); + (GDestroyNotify) bt_object_put_ref); if (!plugin_set->plugins) { BT_LOGE_STR("Failed to allocate a GPtrArray."); - BT_PUT(plugin_set); + BT_OBJECT_PUT_REF_AND_RESET(plugin_set); goto end; } @@ -371,12 +432,11 @@ void bt_plugin_set_add_plugin(struct bt_plugin_set *plugin_set, { BT_ASSERT(plugin_set); BT_ASSERT(plugin); - g_ptr_array_add(plugin_set->plugins, bt_get(plugin)); - BT_LOGV("Added plugin to plugin set: " - "plugin-set-addr=%p, plugin-addr=%p, plugin-name=\"%s\", " - "plugin-path=\"%s\"", - plugin_set, plugin, bt_plugin_get_name(plugin), - bt_plugin_get_path(plugin)); + bt_object_get_ref(plugin); + g_ptr_array_add(plugin_set->plugins, plugin); + BT_LIB_LOGV("Added plugin to plugin set: " + "plugin-set-addr=%p, %![plugin-]+l", + plugin_set, plugin); } #endif /* BABELTRACE_PLUGIN_PLUGIN_INTERNAL_H */