diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2018-07-23 18:57:49 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2018-07-23 19:01:46 (GMT) | 
| commit | abefe01dd260cddbd253ba0c03d9c903138c71c1 (patch) | |
| tree | 834f683e79893534324af94c537984542b7dc00a /src/plugins/plugin.c | |
| parent | 50eb8c462e7ad2b4e5b82d27b1af6e86091ea272 (diff) | |
Tracked the reference counter for plugins with more care.
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));              } | 
