summaryrefslogtreecommitdiff
path: root/src/plugins/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/plugin.c')
-rw-r--r--src/plugins/plugin.c66
1 files changed, 56 insertions, 10 deletions
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index 58671b6..de9c953 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -117,6 +117,33 @@ static void g_plugin_module_init(GPluginModule *plugin)
static void g_plugin_module_dispose(GPluginModule *plugin)
{
+ const plugin_interface *pg_iface; /* Définition du greffon */
+ size_t i; /* Boucle de parcours */
+ GPluginModule *dependency; /* Module nécessaire */
+
+ pg_iface = g_plugin_module_get_interface(plugin);
+
+ if (pg_iface != NULL)
+ {
+ lock_plugin_list_for_reading();
+
+ for (i = 0; i < pg_iface->required_count; i++)
+ {
+ dependency = get_plugin_by_name(pg_iface->required[i], NULL);
+ assert(dependency != NULL);
+
+ /* Un coup pour l'appel à get_plugin_by_name(). */
+ g_object_unref(G_OBJECT(dependency));
+
+ /* Un coup pour la dépendance */
+ g_object_unref(G_OBJECT(dependency));
+
+ }
+
+ unlock_plugin_list_for_reading();
+
+ }
+
if (plugin->exit != NULL)
plugin->exit(plugin);
@@ -235,16 +262,30 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
case DPS_NONE:
break;
- case PGA_PLUGIN_INIT:
- if (!load_plugin_symbol(result->module,
- "chrysalide_plugin_init", &result->init))
- goto bad_plugin;
- break;
+ case DPS_PG_MANAGEMENT:
+
+ switch (action)
+ {
+ case PGA_PLUGIN_INIT:
+ if (!load_plugin_symbol(result->module,
+ "chrysalide_plugin_init", &result->init))
+ goto bad_plugin;
+ break;
+
+ case PGA_PLUGIN_EXIT:
+ if (!load_plugin_symbol(result->module,
+ "chrysalide_plugin_exit", &result->exit))
+ goto bad_plugin;
+ break;
+
+ default:
+ log_variadic_message(LMT_WARNING,
+ _("Unknown action '0x%02x' in plugin '%s'..."),
+ result->interface->actions[i], filename);
+ break;
+
+ }
- case PGA_PLUGIN_EXIT:
- if (!load_plugin_symbol(result->module,
- "chrysalide_plugin_exit", &result->exit))
- goto bad_plugin;
break;
default:
@@ -494,7 +535,12 @@ bool g_plugin_module_resolve_dependencies(GPluginModule *plugin, GPluginModule *
set_in_bit_field(new, index, 1);
or_bit_field(new, dependency->dependencies);
- g_object_unref(G_OBJECT(dependency));
+ /**
+ * Si la référence pour dépendance a déjà été prise.
+ */
+
+ if (test_in_bit_field(plugin->dependencies, index))
+ g_object_unref(G_OBJECT(dependency));
}