diff options
Diffstat (limited to 'src/plugins/plugin.c')
-rw-r--r-- | src/plugins/plugin.c | 66 |
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)); } |