#ifndef BABELTRACE2_PLUGIN_PLUGIN_LOADING_H #define BABELTRACE2_PLUGIN_PLUGIN_LOADING_H /* * Copyright (c) 2010-2019 EfficiOS Inc. and Linux Foundation * * 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 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef __BT_IN_BABELTRACE_H # error "Please include instead." #endif #include #include #include #ifdef __cplusplus extern "C" { #endif /*! @defgroup api-plugin Plugin loading @brief Plugin loading functions. A plugin is a package of \bt_p_comp_cls: @image html plugin.png "A plugin is a package of component classes." @attention The plugin loading API offers functions to find and load existing plugins and use the packaged \bt_p_comp_cls. To \em write a plugin, see \ref api-plugin-dev. There are three types of plugins:
Shared object plugin
.so file on Unix systems; .dll file on Windows systems.
Python 3 plugin
.py file which starts with the bt_plugin_ prefix.
Static plugin
A plugin built directly into libbabeltrace2 or into the user application.
libbabeltrace2 loads shared object and Python plugins. Those plugins need libbabeltrace2 in turn to create and use \bt_name objects: @image html linking.png "libbabeltrace2 loads plugins which need libbabeltrace2." A plugin is a \ref api-fund-shared-object "shared object": get a new reference with bt_plugin_get_ref() and put an existing reference with bt_plugin_put_ref(). Get the number of \bt_comp_cls in a plugin with bt_plugin_get_source_component_class_count(), bt_plugin_get_filter_component_class_count(), and bt_plugin_get_sink_component_class_count(). Borrow a \bt_comp_cls by index from a plugin with bt_plugin_borrow_source_component_class_by_index_const(), bt_plugin_borrow_filter_component_class_by_index_const(), and bt_plugin_borrow_sink_component_class_by_index_const(). Borrow a \bt_comp_cls by name from a plugin with bt_plugin_borrow_source_component_class_by_name_const(), bt_plugin_borrow_filter_component_class_by_name_const(), and bt_plugin_borrow_sink_component_class_by_name_const(). The bt_plugin_find_all(), bt_plugin_find_all_from_file(), bt_plugin_find_all_from_dir(), and bt_plugin_find_all_from_static() functions return a plugin set, that is, a shared object containing one or more plugins.

Find and load plugins

\anchor api-plugin-def-dirs The bt_plugin_find() and bt_plugin_find_all() functions find and load plugins from the default plugin search directories and from the static plugins. The plugin search order is: -# The colon-separated (or semicolon-separated on Windows) list of directories in the \c BABELTRACE_PLUGIN_PATH environment variable, if it's set. The function searches each directory in this list, without recursing. -# $HOME/.local/lib/babeltrace2/plugins, without recursing. -# The system \bt_name plugin directory, typically /usr/lib/babeltrace2/plugins or /usr/local/lib/babeltrace2/plugins on Linux, without recursing. -# The static plugins. Both bt_plugin_find() and bt_plugin_find_all() functions have dedicated boolean parameters to include or exclude each of the four locations above.

Find and load a plugin by name

Find and load a plugin by name with bt_plugin_find(). bt_plugin_find() tries to find a plugin with a specific name within the \ref api-plugin-def-dirs "default plugin search directories" and static plugins.

Find and load all the plugins from the default directories

Load all the plugins found in the \ref api-plugin-def-dirs "default plugin search directories" and static plugins with bt_plugin_find_all().

Find and load plugins from a specific file or directory

Find and load plugins from a specific file (.so, .dll, or .py) with bt_plugin_find_all_from_file(). A single shared object file can contain multiple plugins, although it's not common practice to do so. Find and load plugins from a specific directory with bt_plugin_find_all_from_dir(). This function can search for plugins within the given directory recursively or not.

Find and load static plugins

Find and load static plugins with bt_plugin_find_all_from_static(). A static plugin is built directly into the application or library instead of being a separate shared object file.

Plugin properties

A plugin has the following properties:
\anchor api-plugin-prop-name Name
Name of the plugin. The plugin's name is not related to its file name. For example, a plugin found in the file \c patente.so can be named Dan. Use bt_plugin_get_name().
\anchor api-plugin-prop-descr \bt_dt_opt Description
Description of the plugin. Use bt_plugin_get_description().
\anchor api-plugin-prop-author \bt_dt_opt Author name(s)
Name(s) of the plugin's author(s). Use bt_plugin_get_author().
\anchor api-plugin-prop-license \bt_dt_opt License
License or license name of the plugin. Use bt_plugin_get_license().
\anchor api-plugin-prop-path \bt_dt_opt Path
Path of the file which contains the plugin. A static plugin has no path property. Get bt_plugin_get_path().
\anchor api-plugin-prop-version \bt_dt_opt Version
Version of the plugin (major, minor, patch, and extra information). The plugin's version is completely user-defined: the library does not use this property in any way to verify the plugin's compatibility. Use bt_plugin_get_version().
*/ /*! @{ */ /*! @name Type @{ @typedef struct bt_plugin bt_plugin; @brief Plugin. @typedef struct bt_plugin_set bt_plugin_set; @brief Set of plugins. @} */ /*! @name Find and load plugins @{ */ /*! @brief Status codes for bt_plugin_find(). */ typedef enum bt_plugin_find_status { /*! @brief Success. */ BT_PLUGIN_FIND_STATUS_OK = __BT_FUNC_STATUS_OK, /*! @brief Plugin not found. */ BT_PLUGIN_FIND_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, /*! @brief Out of memory. */ BT_PLUGIN_FIND_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, /*! @brief Error. */ BT_PLUGIN_FIND_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_plugin_find_status; /*! @brief Finds and loads a single plugin which has the name \bt_p{plugin_name} from the default plugin search directories and static plugins, setting \bt_p{*plugin} to the result. This function returns the first plugin which has the name \bt_p{plugin_name} within, in order: -# If the \bt_p{find_in_std_env_var} parameter is #BT_TRUE, the colon-separated (or semicolon-separated on Windows) list of directories in the \c BABELTRACE_PLUGIN_PATH environment variable, if it's set. The function searches each directory in this list, without recursing. -# If the \bt_p{find_in_user_dir} parameter is #BT_TRUE, $HOME/.local/lib/babeltrace2/plugins, without recursing. -# If the \bt_p{find_in_sys_dir} is #BT_TRUE, the system \bt_name plugin directory, typically /usr/lib/babeltrace2/plugins or /usr/local/lib/babeltrace2/plugins on Linux, without recursing. -# If the \bt_p{find_in_static} is #BT_TRUE, the static plugins. @note A plugin's name is not related to the name of its file (shared object or Python file). For example, a plugin found in the file \c patente.so can be named Dan. If this function finds a file which looks like a plugin (shared object file or Python file with the \c bt_plugin_ prefix), but it fails to load it for any reason, the function:
If \bt_p{fail_on_load_error} is #BT_TRUE
Returns #BT_PLUGIN_FIND_STATUS_ERROR.
If \bt_p{fail_on_load_error} is #BT_FALSE
Ignores the loading error and continues searching.
If this function doesn't find any plugin, it returns #BT_PLUGIN_FIND_STATUS_NOT_FOUND and does \em not set \bt_p{*plugin}. @param[in] plugin_name Name of the plugin to find and load. @param[in] find_in_std_env_var #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in the colon-separated (or semicolon-separated on Windows) list of directories in the \c BABELTRACE_PLUGIN_PATH environment variable. @param[in] find_in_user_dir #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in the $HOME/.local/lib/babeltrace2/plugins directory, without recursing. @param[in] find_in_sys_dir #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in the system \bt_name plugin directory. @param[in] find_in_static #BT_TRUE to try to find the plugin named \bt_p{plugin_name} in the static plugins. @param[in] fail_on_load_error #BT_TRUE to make this function return #BT_PLUGIN_FIND_STATUS_ERROR on any plugin loading error instead of ignoring it. @param[out] plugin On success, \bt_p{*plugin} is a new plugin reference of named \bt_p{plugin_name}. @retval #BT_PLUGIN_FIND_STATUS_OK Success. @retval #BT_PLUGIN_FIND_STATUS_NOT_FOUND Plugin not found. @retval #BT_PLUGIN_FIND_STATUS_MEMORY_ERROR Out of memory. @retval #BT_PLUGIN_FIND_STATUS_ERROR Error. @bt_pre_not_null{plugin_name} @pre At least one of the \bt_p{find_in_std_env_var}, \bt_p{find_in_user_dir}, \bt_p{find_in_sys_dir}, and \bt_p{find_in_static} parameters is #BT_TRUE. @bt_pre_not_null{plugin} @sa bt_plugin_find_all() — Finds and loads all plugins from the default plugin search directories and static plugins. */ extern bt_plugin_find_status bt_plugin_find(const char *plugin_name, bt_bool find_in_std_env_var, bt_bool find_in_user_dir, bt_bool find_in_sys_dir, bt_bool find_in_static, bt_bool fail_on_load_error, const bt_plugin **plugin); /*! @brief Status codes for bt_plugin_find_all(). */ typedef enum bt_plugin_find_all_status { /*! @brief Success. */ BT_PLUGIN_FIND_ALL_STATUS_OK = __BT_FUNC_STATUS_OK, /*! @brief No plugins found. */ BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, /*! @brief Out of memory. */ BT_PLUGIN_FIND_ALL_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, /*! @brief Error. */ BT_PLUGIN_FIND_ALL_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_plugin_find_all_status; /*! @brief Finds and loads all the plugins from the default plugin search directories and static plugins, setting \bt_p{*plugins} to the result. This function returns all the plugins within, in order: -# If the \bt_p{find_in_std_env_var} parameter is #BT_TRUE, the colon-separated (or semicolon-separated on Windows) list of directories in the \c BABELTRACE_PLUGIN_PATH environment variable, if it's set. The function searches each directory in this list, without recursing. -# If the \bt_p{find_in_user_dir} parameter is #BT_TRUE, $HOME/.local/lib/babeltrace2/plugins, without recursing. -# If the \bt_p{find_in_sys_dir} is #BT_TRUE, the system \bt_name plugin directory, typically /usr/lib/babeltrace2/plugins or /usr/local/lib/babeltrace2/plugins on Linux, without recursing. -# If the \bt_p{find_in_static} is #BT_TRUE, the static plugins. During the search process, if a found plugin shares the name of an already loaded plugin, this function ignores it and continues. If this function finds a file which looks like a plugin (shared object file or Python file with the \c bt_plugin_ prefix), but it fails to load it for any reason, the function:
If \bt_p{fail_on_load_error} is #BT_TRUE
Returns #BT_PLUGIN_FIND_ALL_STATUS_ERROR.
If \bt_p{fail_on_load_error} is #BT_FALSE
Ignores the loading error and continues searching.
If this function doesn't find any plugin, it returns #BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND and does \em not set \bt_p{*plugins}. @param[in] find_in_std_env_var #BT_TRUE to try to find all the plugins in the colon-separated (or semicolon-separated on Windows) list of directories in the \c BABELTRACE_PLUGIN_PATH environment variable. @param[in] find_in_user_dir #BT_TRUE to try to find all the plugins in the $HOME/.local/lib/babeltrace2/plugins directory, without recursing. @param[in] find_in_sys_dir #BT_TRUE to try to find all the plugins in the system \bt_name plugin directory. @param[in] find_in_static #BT_TRUE to try to find all the plugins in the static plugins. @param[in] fail_on_load_error #BT_TRUE to make this function return #BT_PLUGIN_FIND_ALL_STATUS_ERROR on any plugin loading error instead of ignoring it. @param[out] plugins On success, \bt_p{*plugins} is a new plugin set reference which contains all the plugins found from the default plugin search directories and static plugins. @retval #BT_PLUGIN_FIND_ALL_STATUS_OK Success. @retval #BT_PLUGIN_FIND_ALL_STATUS_NOT_FOUND No plugins found. @retval #BT_PLUGIN_FIND_ALL_STATUS_MEMORY_ERROR Out of memory. @retval #BT_PLUGIN_FIND_ALL_STATUS_ERROR Error. @pre At least one of the \bt_p{find_in_std_env_var}, \bt_p{find_in_user_dir}, \bt_p{find_in_sys_dir}, and \bt_p{find_in_static} parameters is #BT_TRUE. @bt_pre_not_null{plugins} @sa bt_plugin_find() — Finds and loads a single plugin by name from the default plugin search directories and static plugins. */ bt_plugin_find_all_status bt_plugin_find_all(bt_bool find_in_std_env_var, bt_bool find_in_user_dir, bt_bool find_in_sys_dir, bt_bool find_in_static, bt_bool fail_on_load_error, const bt_plugin_set **plugins); /*! @brief Status codes for bt_plugin_find_all_from_file(). */ typedef enum bt_plugin_find_all_from_file_status { /*! @brief Success. */ BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_OK = __BT_FUNC_STATUS_OK, /*! @brief No plugins found. */ BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, /*! @brief Out of memory. */ BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, /*! @brief Error. */ BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_plugin_find_all_from_file_status; /*! @brief Finds and loads all the plugins from the file with path \bt_p{path}, setting \bt_p{*plugins} to the result. @note A plugin's name is not related to the name of its file (shared object or Python file). For example, a plugin found in the file \c patente.so can be named Dan. If any plugin loading error occurs during this function's execution, the function:
If \bt_p{fail_on_load_error} is #BT_TRUE
Returns #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR.
If \bt_p{fail_on_load_error} is #BT_FALSE
Ignores the loading error and continues.
If this function doesn't find any plugin, it returns #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND and does \em not set \bt_p{*plugins}. @param[in] path Path of the file in which to find and load all the plugins. @param[in] fail_on_load_error #BT_TRUE to make this function return #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR on any plugin loading error instead of ignoring it. @param[out] plugins On success, \bt_p{*plugins} is a new plugin set reference which contains all the plugins found in the file with path \bt_p{path}. @retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_OK Success. @retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_NOT_FOUND No plugins found. @retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_MEMORY_ERROR Out of memory. @retval #BT_PLUGIN_FIND_ALL_FROM_FILE_STATUS_ERROR Error. @bt_pre_not_null{path} @pre \bt_p{path} is the path of a regular file. @bt_pre_not_null{plugins} @sa bt_plugin_find_all_from_dir() — Finds and loads all plugins from a given directory. */ extern bt_plugin_find_all_from_file_status bt_plugin_find_all_from_file( const char *path, bt_bool fail_on_load_error, const bt_plugin_set **plugins); /*! @brief Status codes for bt_plugin_find_all_from_dir(). */ typedef enum bt_plugin_find_all_from_dir_status { /*! @brief Success. */ BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_OK = __BT_FUNC_STATUS_OK, /*! @brief No plugins found. */ BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, /*! @brief Out of memory. */ BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, /*! @brief Error. */ BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_plugin_find_all_from_dir_status; /*! @brief Finds and loads all the plugins from the directory with path \bt_p{path}, setting \bt_p{*plugins} to the result. If \bt_p{recurse} is #BT_TRUE, this function recurses into the subdirectories of \bt_p{path} to find plugins. During the search process, if a found plugin shares the name of an already loaded plugin, this function ignores it and continues. @attention As of \bt_name_version_min_maj, the file and directory traversal order is undefined. If any plugin loading error occurs during this function's execution, the function:
If \bt_p{fail_on_load_error} is #BT_TRUE
Returns #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR.
If \bt_p{fail_on_load_error} is #BT_FALSE
Ignores the loading error and continues.
If this function doesn't find any plugin, it returns #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND and does \em not set \bt_p{*plugins}. @param[in] path Path of the directory in which to find and load all the plugins. @param[in] recurse #BT_TRUE to make this function recurse into the subdirectories of \bt_p{path}. @param[in] fail_on_load_error #BT_TRUE to make this function return #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR on any plugin loading error instead of ignoring it. @param[out] plugins On success, \bt_p{*plugins} is a new plugin set reference which contains all the plugins found in the directory with path \bt_p{path}. @retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_OK Success. @retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_NOT_FOUND No plugins found. @retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_MEMORY_ERROR Out of memory. @retval #BT_PLUGIN_FIND_ALL_FROM_DIR_STATUS_ERROR Error. @bt_pre_not_null{path} @pre \bt_p{path} is the path of a directory. @bt_pre_not_null{plugins} @sa bt_plugin_find_all_from_file() — Finds and loads all plugins from a given file. */ extern bt_plugin_find_all_from_dir_status bt_plugin_find_all_from_dir( const char *path, bt_bool recurse, bt_bool fail_on_load_error, const bt_plugin_set **plugins); /*! @brief Status codes for bt_plugin_find_all_from_static(). */ typedef enum bt_plugin_find_all_from_static_status { /*! @brief Success. */ BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_OK = __BT_FUNC_STATUS_OK, /*! @brief No static plugins found. */ BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND = __BT_FUNC_STATUS_NOT_FOUND, /*! @brief Out of memory. */ BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR, /*! @brief Error. */ BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR = __BT_FUNC_STATUS_ERROR, } bt_plugin_find_all_from_static_status; /*! @brief Finds and loads all the static plugins, setting \bt_p{*plugins} to the result. A static plugin is built directly into the application or library instead of being a separate shared object file. If any plugin loading error occurs during this function's execution, the function:
If \bt_p{fail_on_load_error} is #BT_TRUE
Returns #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR.
If \bt_p{fail_on_load_error} is #BT_FALSE
Ignores the loading error and continues.
If this function doesn't find any plugin, it returns #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND and does \em not set \bt_p{*plugins}. @param[in] fail_on_load_error #BT_TRUE to make this function return #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR on any plugin loading error instead of ignoring it. @param[out] plugins On success, \bt_p{*plugins} is a new plugin set reference which contains all the static plugins. @retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_OK Success. @retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_NOT_FOUND No static plugins found. @retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_MEMORY_ERROR Out of memory. @retval #BT_PLUGIN_FIND_ALL_FROM_STATIC_STATUS_ERROR Error. @bt_pre_not_null{path} @bt_pre_not_null{plugins} */ extern bt_plugin_find_all_from_static_status bt_plugin_find_all_from_static( bt_bool fail_on_load_error, const bt_plugin_set **plugins); /*! @} */ /*! @name Plugin properties @{ */ /*! @brief Returns the name of the plugin \bt_p{plugin}. See the \ref api-plugin-prop-name "name" property. @param[in] plugin Plugin of which to get the name. @returns @parblock Name of \bt_p{plugin}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} */ extern const char *bt_plugin_get_name(const bt_plugin *plugin); /*! @brief Returns the description of the plugin \bt_p{plugin}. See the \ref api-plugin-prop-descr "description" property. @param[in] plugin Plugin of which to get description. @returns @parblock Description of \bt_p{plugin}, or \c NULL if not available. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} */ extern const char *bt_plugin_get_description(const bt_plugin *plugin); /*! @brief Returns the name(s) of the author(s) of the plugin \bt_p{plugin}. See the \ref api-plugin-prop-author "author name(s)" property. @param[in] plugin Plugin of which to get the author name(s). @returns @parblock Author name(s) of \bt_p{plugin}, or \c NULL if not available. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} */ extern const char *bt_plugin_get_author(const bt_plugin *plugin); /*! @brief Returns the license text or the license name of the plugin \bt_p{plugin}. See the \ref api-plugin-prop-license "license" property. @param[in] plugin Plugin of which to get the license. @returns @parblock License of \bt_p{plugin}, or \c NULL if not available. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} */ extern const char *bt_plugin_get_license(const bt_plugin *plugin); /*! @brief Returns the path of the file which contains the plugin \bt_p{plugin}. See the \ref api-plugin-prop-path "path" property. This function returns \c NULL if \bt_p{plugin} is a static plugin because a static plugin has no path property. @param[in] plugin Plugin of which to get the containing file's path. @returns @parblock Path of the file which contains \bt_p{plugin}, or \c NULL if not available. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} */ extern const char *bt_plugin_get_path(const bt_plugin *plugin); /*! @brief Returns the version of the plugin \bt_p{plugin}. See the \ref api-plugin-prop-version "version" property. @param[in] plugin Plugin of which to get the version. @param[out] major If not \c NULL and this function returns #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*major} is the major version of \bt_p{plugin}. @param[out] minor If not \c NULL and this function returns #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*minor} is the minor version of \bt_p{plugin}. @param[out] patch If not \c NULL and this function returns #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*patch} is the patch version of \bt_p{plugin}. @param[out] extra @parblock If not \c NULL and this function returns #BT_PROPERTY_AVAILABILITY_AVAILABLE, \bt_p{*extra} is the version's extra information of \bt_p{plugin}. \bt_p{*extra} can be \c NULL if the plugin's version has no extra information. \bt_p{*extra} remains valid as long as \bt_p{plugin} exists. @endparblock @retval #BT_PROPERTY_AVAILABILITY_AVAILABLE The version of \bt_p{plugin} is available. @retval #BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE The version of \bt_p{plugin} is not available. @bt_pre_not_null{plugin} */ extern bt_property_availability bt_plugin_get_version( const bt_plugin *plugin, unsigned int *major, unsigned int *minor, unsigned int *patch, const char **extra); /*! @} */ /*! @name Plugin component class access @{ */ /*! @brief Returns the number of source component classes contained in the plugin \bt_p{plugin}. @param[in] plugin Plugin of which to get the number of contained source component classes. @returns Number of contained source component classes in \bt_p{plugin}. @bt_pre_not_null{plugin} */ extern uint64_t bt_plugin_get_source_component_class_count( const bt_plugin *plugin); /*! @brief Returns the number of filter component classes contained in the plugin \bt_p{plugin}. @param[in] plugin Plugin of which to get the number of contained filter component classes. @returns Number of contained filter component classes in \bt_p{plugin}. @bt_pre_not_null{plugin} */ extern uint64_t bt_plugin_get_filter_component_class_count( const bt_plugin *plugin); /*! @brief Returns the number of sink component classes contained in the plugin \bt_p{plugin}. @param[in] plugin Plugin of which to get the number of contained sink component classes. @returns Number of contained sink component classes in \bt_p{plugin}. @bt_pre_not_null{plugin} */ extern uint64_t bt_plugin_get_sink_component_class_count( const bt_plugin *plugin); /*! @brief Borrows the source component class at index \bt_p{index} from the plugin \bt_p{plugin}. @param[in] plugin Plugin from which to borrow the source component class at index \bt_p{index}. @param[in] index Index of the source component class to borrow from \bt_p{plugin}. @returns @parblock \em Borrowed reference of the source component class of \bt_p{plugin} at index \bt_p{index}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} @pre \bt_p{index} is less than the number of source component classes in \bt_p{plugin} (as returned by bt_plugin_get_source_component_class_count()). @sa bt_plugin_borrow_source_component_class_by_name_const() — Borrows a source component class by name from a plugin. */ extern const bt_component_class_source * bt_plugin_borrow_source_component_class_by_index_const( const bt_plugin *plugin, uint64_t index); /*! @brief Borrows the filter component class at index \bt_p{index} from the plugin \bt_p{plugin}. @param[in] plugin Plugin from which to borrow the filter component class at index \bt_p{index}. @param[in] index Index of the filter component class to borrow from \bt_p{plugin}. @returns @parblock \em Borrowed reference of the filter component class of \bt_p{plugin} at index \bt_p{index}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} @pre \bt_p{index} is less than the number of filter component classes in \bt_p{plugin} (as returned by bt_plugin_get_source_component_class_count()). @sa bt_plugin_borrow_source_component_class_by_name_const() — Borrows a filter component class by name from a plugin. */ extern const bt_component_class_filter * bt_plugin_borrow_filter_component_class_by_index_const( const bt_plugin *plugin, uint64_t index); /*! @brief Borrows the sink component class at index \bt_p{index} from the plugin \bt_p{plugin}. @param[in] plugin Plugin from which to borrow the sink component class at index \bt_p{index}. @param[in] index Index of the sink component class to borrow from \bt_p{plugin}. @returns @parblock \em Borrowed reference of the sink component class of \bt_p{plugin} at index \bt_p{index}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} @pre \bt_p{index} is less than the number of sink component classes in \bt_p{plugin} (as returned by bt_plugin_get_source_component_class_count()). @sa bt_plugin_borrow_source_component_class_by_name_const() — Borrows a sink component class by name from a plugin. */ extern const bt_component_class_sink * bt_plugin_borrow_sink_component_class_by_index_const( const bt_plugin *plugin, uint64_t index); /*! @brief Borrows the source component class named \bt_p{name} from the plugin \bt_p{plugin}. If no source component class has the name \bt_p{name} within \bt_p{plugin}, this function returns \c NULL. @param[in] plugin Plugin from which to borrow the source component class named \bt_p{name}. @param[in] name Name of the source component class to borrow from \bt_p{plugin}. @returns @parblock \em Borrowed reference of the source component class of \bt_p{plugin} named \bt_p{name}, or \c NULL if no source component class is named \bt_p{name} within \bt_p{plugin}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} @bt_pre_not_null{name} @sa bt_plugin_borrow_source_component_class_by_index_const() — Borrows a source component class by index from a plugin. */ extern const bt_component_class_source * bt_plugin_borrow_source_component_class_by_name_const( const bt_plugin *plugin, const char *name); /*! @brief Borrows the filter component class named \bt_p{name} from the plugin \bt_p{plugin}. If no filter component class has the name \bt_p{name} within \bt_p{plugin}, this function returns \c NULL. @param[in] plugin Plugin from which to borrow the filter component class named \bt_p{name}. @param[in] name Name of the filter component class to borrow from \bt_p{plugin}. @returns @parblock \em Borrowed reference of the filter component class of \bt_p{plugin} named \bt_p{name}, or \c NULL if no filter component class is named \bt_p{name} within \bt_p{plugin}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} @bt_pre_not_null{name} @sa bt_plugin_borrow_filter_component_class_by_index_const() — Borrows a filter component class by index from a plugin. */ extern const bt_component_class_filter * bt_plugin_borrow_filter_component_class_by_name_const( const bt_plugin *plugin, const char *name); /*! @brief Borrows the sink component class named \bt_p{name} from the plugin \bt_p{plugin}. If no sink component class has the name \bt_p{name} within \bt_p{plugin}, this function returns \c NULL. @param[in] plugin Plugin from which to borrow the sink component class named \bt_p{name}. @param[in] name Name of the sink component class to borrow from \bt_p{plugin}. @returns @parblock \em Borrowed reference of the sink component class of \bt_p{plugin} named \bt_p{name}, or \c NULL if no sink component class is named \bt_p{name} within \bt_p{plugin}. The returned pointer remains valid as long as \bt_p{plugin} exists. @endparblock @bt_pre_not_null{plugin} @bt_pre_not_null{name} @sa bt_plugin_borrow_sink_component_class_by_index_const() — Borrows a sink component class by index from a plugin. */ extern const bt_component_class_sink * bt_plugin_borrow_sink_component_class_by_name_const( const bt_plugin *plugin, const char *name); /*! @} */ /*! @name Plugin reference count @{ */ /*! @brief Increments the \ref api-fund-shared-object "reference count" of the plugin \bt_p{plugin}. @param[in] plugin @parblock Plugin of which to increment the reference count. Can be \c NULL. @endparblock @sa bt_plugin_put_ref() — Decrements the reference count of a plugin. */ extern void bt_plugin_get_ref(const bt_plugin *plugin); /*! @brief Decrements the \ref api-fund-shared-object "reference count" of the plugin \bt_p{plugin}. @param[in] plugin @parblock Plugin of which to decrement the reference count. Can be \c NULL. @endparblock @sa bt_plugin_get_ref() — Increments the reference count of a plugin. */ extern void bt_plugin_put_ref(const bt_plugin *plugin); /*! @brief Decrements the reference count of the plugin \bt_p{_plugin}, and then sets \bt_p{_plugin} to \c NULL. @param _plugin @parblock Plugin of which to decrement the reference count. Can contain \c NULL. @endparblock @bt_pre_assign_expr{_plugin} */ #define BT_PLUGIN_PUT_REF_AND_RESET(_plugin) \ do { \ bt_plugin_put_ref(_plugin); \ (_plugin) = NULL; \ } while (0) /*! @brief Decrements the reference count of the plugin \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. This macro effectively moves a plugin reference from the expression \bt_p{_src} to the expression \bt_p{_dst}, putting the existing \bt_p{_dst} reference. @param _dst @parblock Destination expression. Can contain \c NULL. @endparblock @param _src @parblock Source expression. Can contain \c NULL. @endparblock @bt_pre_assign_expr{_dst} @bt_pre_assign_expr{_src} */ #define BT_PLUGIN_MOVE_REF(_dst, _src) \ do { \ bt_plugin_put_ref(_dst); \ (_dst) = (_src); \ (_src) = NULL; \ } while (0) /*! @} */ /*! @name Plugin set plugin access @{ */ /*! @brief Returns the number of plugins contained in the plugin set \bt_p{plugin_set}. @param[in] plugin_set Plugin set of which to get the number of contained plugins. @returns Number of contained plugins in \bt_p{plugin_set}. @bt_pre_not_null{plugin} */ extern uint64_t bt_plugin_set_get_plugin_count( const bt_plugin_set *plugin_set); /*! @brief Borrows the plugin at index \bt_p{index} from the plugin set \bt_p{plugin_set}. @param[in] plugin_set Plugin set from which to borrow the plugin at index \bt_p{index}. @param[in] index Index of the plugin to borrow from \bt_p{plugin_set}. @returns @parblock \em Borrowed reference of the plugin of \bt_p{plugin_set} at index \bt_p{index}. The returned pointer remains valid until \bt_p{plugin_set} is modified. @endparblock @bt_pre_not_null{plugin_set} @pre \bt_p{index} is less than the number of plugins in \bt_p{plugin_set} (as returned by bt_plugin_set_get_plugin_count()). */ extern const bt_plugin *bt_plugin_set_borrow_plugin_by_index_const( const bt_plugin_set *plugin_set, uint64_t index); /*! @} */ /*! @name Plugin set reference count @{ */ /*! @brief Increments the \ref api-fund-shared-object "reference count" of the plugin set \bt_p{plugin_set}. @param[in] plugin_set @parblock Plugin set of which to increment the reference count. Can be \c NULL. @endparblock @sa bt_plugin_set_put_ref() — Decrements the reference count of a plugin set. */ extern void bt_plugin_set_get_ref(const bt_plugin_set *plugin_set); /*! @brief Decrements the \ref api-fund-shared-object "reference count" of the plugin set \bt_p{plugin_set}. @param[in] plugin_set @parblock Plugin set of which to decrement the reference count. Can be \c NULL. @endparblock @sa bt_plugin_set_get_ref() — Increments the reference count of a plugin set. */ extern void bt_plugin_set_put_ref(const bt_plugin_set *plugin_set); /*! @brief Decrements the reference count of the plugin set \bt_p{_plugin_set}, and then sets \bt_p{_plugin_set} to \c NULL. @param _plugin_set @parblock Plugin set of which to decrement the reference count. Can contain \c NULL. @endparblock @bt_pre_assign_expr{_plugin_set} */ #define BT_PLUGIN_SET_PUT_REF_AND_RESET(_plugin_set) \ do { \ bt_plugin_set_put_ref(_plugin_set); \ (_plugin_set) = NULL; \ } while (0) /*! @brief Decrements the reference count of the plugin set \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL. This macro effectively moves a plugin set reference from the expression \bt_p{_src} to the expression \bt_p{_dst}, putting the existing \bt_p{_dst} reference. @param _dst @parblock Destination expression. Can contain \c NULL. @endparblock @param _src @parblock Source expression. Can contain \c NULL. @endparblock @bt_pre_assign_expr{_dst} @bt_pre_assign_expr{_src} */ #define BT_PLUGIN_SET_MOVE_REF(_dst, _src) \ do { \ bt_plugin_set_put_ref(_dst); \ (_dst) = (_src); \ (_src) = NULL; \ } while (0) /*! @} */ /*! @} */ #ifdef __cplusplus } #endif #endif /* BABELTRACE2_PLUGIN_PLUGIN_LOADING_H */