EVOLUTION SLOW START , a workaround
E. J. Cerejo
ejcerejo at optonline.net
Tue Mar 11 23:54:02 UTC 2008
On Tue, 11 Mar 2008 17:45:05 -0300
sergio lenzi <lenzi at k1.com.br> wrote:
> Hello all
>
> This week I have time to trace the problem with evolution that
> lasts too much time to start.
>
> The problem is that glib on function g_module_load, searchs for a symbol
> g_module_check_init, g_module_unload... by default.
>
> It occurs that the evolution code, that will be loaded, does not have
> those functions available... so th glib (and dlsym) tries to find the
> symbol in every load module in memory... and doing so consumes all cpu
> for several seconds, for each load module....
>
> ! coded a solution for gmodule that tests for those special symbos, and
> if found, uses dlsymb(RTLD_NEXT,....) instead of dlsym(handler....)
> so it will search a much less modules, and evolution will start in 3
> seconds... (20 times less...)
>
> Of course the correct strategy is to correct code evolution module
> (libevolution-mail.so). will do next time....
>
> modified file: /usr/ports/devel/glib20/files/patch-gmodule::gmodule-dl.c
>
> please note this is only a temporary fix... the correct solution is to
> fix the
> evolution module....
>
> =============================================
> --- gmodule/gmodule-dl.c.orig 2008-02-07 03:24:53.000000000 -0200
> +++ gmodule/gmodule-dl.c 2008-03-11 18:53:44.000000000 -0300
> @@ -73,6 +73,14 @@
> #endif /* RTLD_GLOBAL */
>
>
> +static char *special_names[]={
> + "g_module_check_init",
> + "g_module_unload",
> + "e_plugin_lib_enable",
> + NULL
> +};
> +
> +
> /* --- functions --- */
> static gchar*
> fetch_dlerror (gboolean replace_null)
> @@ -106,6 +114,7 @@
> static gpointer
> _g_module_self (void)
> {
> +#ifndef __FreeBSD__
> gpointer handle;
>
> /* to query symbols from the program itself, special link options
> @@ -117,6 +126,9 @@
> g_module_set_error (fetch_dlerror (TRUE));
>
> return handle;
> +#else
> + return RTLD_DEFAULT;
> +#endif
> }
>
> static void
> @@ -141,9 +153,19 @@
> {
> gpointer p;
> gchar *msg;
> + char **pn;
>
> fetch_dlerror (FALSE);
> - p = dlsym (handle, symbol_name);
> +
> + for (pn=special_names;*pn;pn++) {
> + if (!strcmp(*pn,symbol_name)) {
> + p=dlsym(RTLD_NEXT,symbol_name);
> + break;
> + }
> + }
> +
> + if (! *pn)
> + p = dlsym (handle, symbol_name);
> msg = fetch_dlerror (FALSE);
> if (msg)
> g_module_set_error (msg);
>
>
> _______________________________________________
> freebsd-questions at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe at freebsd.org"
I stopped using gnome because of evolution and few other admin apps that don't work, it took about 80 seconds to open evolution so I got fed up with it and changed to xfce4, personally I think there's quite a few things broken with gnome, specially the admin part of it which is not a problem with KDE. Posted the problem a few times and all I've got was the freebsd loader spent quit a bit of time looking for every evolution plugin so I disabled them and it still took about 50 seconds to open which was unacceptable to me. Ubuntu on a slower machine only takes about 3 seconds with every plugin enabled so it was obvious to me that there was a bug somewhere. I hope they apply your fix to the gnome port.
More information about the freebsd-questions
mailing list