ref.h: doc: fix typo
[babeltrace.git] / lib / plugin-system / plugin.c
CommitLineData
fb2dcc52
JG
1/*
2 * plugin.c
3 *
4 * Babeltrace Plugin
5 *
3310b217 6 * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
fb2dcc52
JG
7 *
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29#include <babeltrace/compiler.h>
b8a06801 30#include <babeltrace/ref.h>
fb2dcc52 31#include <babeltrace/plugin/plugin-internal.h>
cba174d5 32#include <babeltrace/plugin/component-factory-internal.h>
fb2dcc52
JG
33#include <glib.h>
34
7c7c0433
JG
35#define PLUGIN_SYMBOL_NAME "__bt_plugin_name"
36#define PLUGIN_SYMBOL_AUTHOR "__bt_plugin_author"
37#define PLUGIN_SYMBOL_LICENSE "__bt_plugin_license"
cba174d5 38#define PLUGIN_SYMBOL_REGISTER "__bt_plugin_register"
7c7c0433 39#define PLUGIN_SYMBOL_DESCRIPTION "__bt_plugin_description"
50335272 40
cba174d5
JG
41DECLARE_PLUG_IN_SECTIONS;
42
fb2dcc52 43static
b8a06801 44void bt_plugin_destroy(struct bt_object *obj)
fb2dcc52
JG
45{
46 struct bt_plugin *plugin;
47
b8a06801
JG
48 assert(obj);
49 plugin = container_of(obj, struct bt_plugin, base);
50
fb2dcc52
JG
51 if (plugin->module) {
52 if (!g_module_close(plugin->module)) {
cba174d5 53 printf_error("Module close error: %s\n",
2e339de1 54 g_module_error());
fb2dcc52
JG
55 }
56 }
7c7c0433 57
cba174d5
JG
58 if (plugin->path) {
59 g_string_free(plugin->path, TRUE);
60 }
fb2dcc52
JG
61 g_free(plugin);
62}
63
64BT_HIDDEN
cba174d5
JG
65struct bt_plugin *bt_plugin_create_from_module(GModule *module,
66 const char *path)
fb2dcc52 67{
50335272 68 struct bt_plugin *plugin = NULL;
2e339de1 69 gpointer symbol = NULL;
50335272 70
7c7c0433 71 if (!module || !path) {
50335272
JG
72 goto error;
73 }
fb2dcc52
JG
74
75 plugin = g_new0(struct bt_plugin, 1);
76 if (!plugin) {
50335272 77 goto error;
fb2dcc52
JG
78 }
79
b8a06801 80 bt_object_init(plugin, bt_plugin_destroy);
7c7c0433
JG
81 plugin->path = g_string_new(path);
82 if (!plugin->path) {
83 goto error;
84 }
85
50335272 86 if (!g_module_symbol(module, PLUGIN_SYMBOL_NAME,
2e339de1 87 (gpointer *) &plugin->name)) {
5e86a071 88 printf_verbose("Unable to resolve plugin symbol %s from %s\n",
2e339de1 89 PLUGIN_SYMBOL_NAME, g_module_name(module));
50335272
JG
90 goto error;
91 }
4647b93a 92
50335272 93 if (!g_module_symbol(module, PLUGIN_SYMBOL_LICENSE,
2e339de1 94 (gpointer *) &plugin->license)) {
5e86a071 95 printf_verbose("Unable to resolve plugin symbol %s from %s\n",
2e339de1 96 PLUGIN_SYMBOL_LICENSE, g_module_name(module));
50335272
JG
97 goto error;
98 }
cba174d5
JG
99 if (!g_module_symbol(module, PLUGIN_SYMBOL_AUTHOR,
100 (gpointer *) &plugin->author)) {
101 printf_verbose("Unable to resolve plugin symbol %s from %s\n",
102 PLUGIN_SYMBOL_AUTHOR, g_module_name(module));
103 goto error;
104 }
105 if (!g_module_symbol(module, PLUGIN_SYMBOL_DESCRIPTION,
106 (gpointer *) &plugin->description)) {
107 printf_verbose("Unable to resolve plugin symbol %s from %s\n",
108 PLUGIN_SYMBOL_DESCRIPTION,
109 g_module_name(module));
110 goto error;
111 }
112 if (!g_module_symbol(module, PLUGIN_SYMBOL_REGISTER, &symbol)) {
113 printf_verbose("Unable to resolve plugin symbol %s from %s\n",
114 PLUGIN_SYMBOL_REGISTER, g_module_name(module));
50335272 115 goto error;
2e339de1 116 } else {
cba174d5
JG
117 plugin->_register = *((bt_plugin_register_func *) symbol);
118 if (!plugin->_register) {
119 printf_verbose("NULL %s symbol target\n",
120 PLUGIN_SYMBOL_REGISTER);
2e339de1
JG
121 goto error;
122 }
50335272
JG
123 }
124
cba174d5
JG
125 return plugin;
126error:
127 BT_PUT(plugin);
128 return plugin;
129}
130
131BT_HIDDEN
132struct bt_plugin *bt_plugin_create_from_static(size_t i)
133{
134 struct bt_plugin *plugin = NULL;
135
136 plugin = g_new0(struct bt_plugin, 1);
137 if (!plugin) {
138 goto error;
2e339de1 139 }
50335272 140
cba174d5
JG
141 bt_object_init(plugin, bt_plugin_destroy);
142 plugin->_register = (SECTION_BEGIN(__plugin_register_funcs))[i];
143 if (!plugin->_register) {
144 goto error;
145 }
146 plugin->name = (SECTION_BEGIN(__plugin_names))[i];
147 plugin->author = (SECTION_BEGIN(__plugin_authors))[i];
148 plugin->license = (SECTION_BEGIN(__plugin_licenses))[i];
149 plugin->description = (SECTION_BEGIN(__plugin_descriptions))[i];
fb2dcc52 150 return plugin;
50335272 151error:
cba174d5 152 BT_PUT(plugin);
b8a06801 153 return plugin;
fb2dcc52
JG
154}
155
156BT_HIDDEN
157enum bt_component_status bt_plugin_register_component_classes(
158 struct bt_plugin *plugin, struct bt_component_factory *factory)
159{
160 assert(plugin && factory);
cba174d5 161 return plugin->_register(factory);
fb2dcc52 162}
38b48196
JG
163
164const char *bt_plugin_get_name(struct bt_plugin *plugin)
165{
166 return plugin ? plugin->name : NULL;
167}
168
169const char *bt_plugin_get_author(struct bt_plugin *plugin)
170{
171 return plugin ? plugin->author : NULL;
172}
173
174const char *bt_plugin_get_license(struct bt_plugin *plugin)
175{
176 return plugin ? plugin->license : NULL;
177}
7c7c0433
JG
178
179const char *bt_plugin_get_path(struct bt_plugin *plugin)
180{
cba174d5 181 return (plugin && plugin->path) ? plugin->path->str : NULL;
7c7c0433
JG
182}
183
184const char *bt_plugin_get_description(struct bt_plugin *plugin)
185{
186 return plugin ? plugin->description : NULL;
187}
This page took 0.033074 seconds and 4 git commands to generate.