diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2011-08-05 21:41:27 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2011-08-06 13:54:24 +0800 |
commit | f70f196d4d993d3337545567896f69449cdb6271 (patch) | |
tree | a4490f5baceb222b892e064f0113ef2c11ad57fa /e-util/e-module.c | |
parent | e3a7795a359107c5595985c2561badec9514816a (diff) | |
download | gsoc2013-evolution-f70f196d4d993d3337545567896f69449cdb6271.tar.gz gsoc2013-evolution-f70f196d4d993d3337545567896f69449cdb6271.tar.zst gsoc2013-evolution-f70f196d4d993d3337545567896f69449cdb6271.zip |
EModule: Make all modules resident.
Works around a design flaw in EExtension.
See the comment in e-module.c for more details.
Diffstat (limited to 'e-util/e-module.c')
-rw-r--r-- | e-util/e-module.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/e-util/e-module.c b/e-util/e-module.c index b3e90aac72..46486080d6 100644 --- a/e-util/e-module.c +++ b/e-util/e-module.c @@ -139,6 +139,25 @@ module_load (GTypeModule *type_module) priv->load (type_module); + /* XXX This is a Band-Aid for a design flaw in EExtension. If the + * "extensible_type" member of EExtensionClass is set to a GType + * that hasn't already been registered, then when the extension's + * module is unloaded the GType registration that was triggered + * by setting "extensible_type" will be invalidated and cause + * Evolution to malfunction when the module is loaded again. + * + * Extension modules get loaded and unloaded repeatedly by + * e_extensible_load_extensions(), which temporarily references + * all extension classes and picks out the ones it needs for a + * given EExtensible instance based on the "extensible_type" + * class member. + * + * Making the module resident prevents the aforementioned GType + * registration from being invalidated when the extension class + * is unreferenced. + */ + g_module_make_resident (priv->module); + return TRUE; fail: |