lib: move gtype out of WpPluginMetadata and simplify plugin macros

the GType cannot be in statically allocated data,
since it's not known at compile time
This commit is contained in:
George Kiagiadakis
2019-04-16 18:14:59 +03:00
parent a8450b0f02
commit fad4682df6
3 changed files with 21 additions and 67 deletions

View File

@@ -11,6 +11,7 @@
typedef struct {
gsize block_size;
GType gtype;
const WpPluginMetadata *metadata;
WpPlugin *instance;
} PluginData;
@@ -90,6 +91,7 @@ compare_ranks (const WpPluginMetadata * a, const WpPluginMetadata * b)
/**
* wp_plugin_registry_register_with_metadata: (skip)
* @plugin_type: the #GType of the #WpPlugin subclass
* @metadata: the metadata
* @metadata_size: the sizeof (@metadata), to allow ABI-compatible future
* expansion of the structure
@@ -100,6 +102,7 @@ compare_ranks (const WpPluginMetadata * a, const WpPluginMetadata * b)
*/
void
wp_plugin_registry_register_with_metadata (WpPluginRegistry * self,
GType plugin_type,
const WpPluginMetadata * metadata,
gsize metadata_size)
{
@@ -107,7 +110,7 @@ wp_plugin_registry_register_with_metadata (WpPluginRegistry * self,
g_return_if_fail (WP_IS_PLUGIN_REGISTRY (self));
g_return_if_fail (metadata_size == sizeof (WpPluginMetadata));
g_return_if_fail (g_type_is_a (metadata->gtype, wp_plugin_get_type ()));
g_return_if_fail (g_type_is_a (plugin_type, wp_plugin_get_type ()));
g_return_if_fail (metadata->name != NULL);
g_return_if_fail (metadata->description != NULL);
g_return_if_fail (metadata->author != NULL);
@@ -117,6 +120,7 @@ wp_plugin_registry_register_with_metadata (WpPluginRegistry * self,
data = g_slice_alloc (sizeof (PluginData));
data->block_size = sizeof (PluginData);
data->gtype = plugin_type;
data->metadata = metadata;
data->instance = NULL;
@@ -165,9 +169,9 @@ wp_plugin_registry_register (WpPluginRegistry * self,
data = g_slice_alloc (sizeof (PluginData) + sizeof (WpPluginMetadata));
data->block_size = sizeof (PluginData) + sizeof (WpPluginMetadata);
data->gtype = plugin_type;
metadata = (WpPluginMetadata *) ((guint8 *) data) + sizeof (PluginData);
metadata->gtype = plugin_type;
metadata->rank = rank;
metadata->name = g_string_chunk_insert (self->metadata_strings, name);
metadata->description = g_string_chunk_insert (self->metadata_strings,
@@ -187,7 +191,7 @@ wp_plugin_registry_register (WpPluginRegistry * self,
static inline void
make_plugin (WpPluginRegistry * self, PluginData * plugin_data)
{
plugin_data->instance = g_object_new (plugin_data->metadata->gtype,
plugin_data->instance = g_object_new (plugin_data->gtype,
"registry", self, "metadata", plugin_data->metadata, NULL);
}

View File

@@ -21,6 +21,7 @@ G_DECLARE_FINAL_TYPE (WpPluginRegistry, wp_plugin_registry, WP, PLUGIN_REGISTRY,
WpPluginRegistry * wp_plugin_registry_new (void);
void wp_plugin_registry_register_with_metadata (WpPluginRegistry * self,
GType plugin_type,
const WpPluginMetadata * metadata,
gsize metadata_size);

View File

@@ -40,7 +40,6 @@ typedef enum {
/**
* WpPluginMetadata: (skip)
* @gtype: the #GType of the plugin
* @rank: the rank of the plugin
* @name: the name of the plugin
* @description: plugin description
@@ -56,10 +55,7 @@ typedef enum {
struct _WpPluginMetadata
{
union {
struct {
GType gtype;
guint rank;
};
guint rank;
gpointer _unused_for_alignment[2];
};
const gchar *name;
@@ -190,67 +186,20 @@ const WpPluginMetadata * wp_plugin_get_metadata (WpPlugin * self);
#define WP_MODULE_INIT_SYMBOL wireplumber__module_init
/**
* WP_MODULE_DEFINE: (skip)
* WP_PLUGIN_DEFINE_TYPE: (skip)
*
* A convenience macro to register modules in C/C++.
* A module can contain multiple plugins, which are meant to be registered
* with WP_PLUGIN_REGISTER in the place of @plugin_reg
*
* Example usage:
* |[
* WP_MODULE_DEFINE (
* WP_PLUGIN_REGISTER (
* MY_PLUGIN_TYPE,
* WP_PLUGIN_RANK_PLATFORM_OVERRIDE,
* "myplugin",
* "A custom policy plugin for Awesome Platform",
* "George Kiagiadakis <george.kiagiadakis@collabora.com>",
* "LGPL-2.1-or-later",
* "3.0.1",
* "https://awesome-platform.example"
* );
* WP_PLUGIN_REGISTER (
* SECONDARY_PLUGIN_TYPE,
* WP_PLUGIN_RANK_PLATFORM_OVERRIDE - 1,
* "secondaryplugin",
* "A secondary policy plugin for Awesome Platform",
* "George Kiagiadakis <george.kiagiadakis@collabora.com>",
* "LGPL-2.1-or-later",
* "3.0.1",
* "https://awesome-platform.example"
* );
* )
* ]|
* Convenience macro for defining a #WpPlugin subclass in a module
*/
#define WP_MODULE_DEFINE(plugin_reg) \
G_MODULE_EXPORT void \
WP_MODULE_INIT_SYMBOL (WpPluginRegistry * registry) \
{ \
plugin_reg; \
}
/**
* WP_PLUGIN_REGISTER: (skip)
*
* A convenience macro to register plugins in C/C++.
* See WP_MODULE_DEFINE() for a usage example.
* See wp_plugin_registry_register() for a description of the parameters.
*/
#define WP_PLUGIN_REGISTER(gtype_, rank_, name_, description_, author_, license_, version_, origin_) \
G_STMT_START \
static const WpPluginMetadata plugin_metadata = { \
.gtype = gtype_, \
.rank = rank_, \
.name = name_, \
.description = description_, \
.author = author_, \
.license = license_, \
.version = version_, \
.origin = origin_ \
}; \
wp_plugin_registry_register_with_metadata (registry, &plugin_metadata, \
sizeof (plugin_metadata)); \
G_STMT_END
#define WP_PLUGIN_DEFINE_TYPE(TN, t_n) \
typedef struct _##TN { \
WpPlugin parent; \
} TN; \
\
typedef struct _##TN##Class { \
WpPluginClass parent; \
} TN##Class; \
\
G_DEFINE_TYPE_WITH_PRIVATE (TN, t_n, wp_plugin_get_type ())
G_END_DECLS