Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Mar 2008 17:45:05 -0300
From:      sergio lenzi <lenzi@k1.com.br>
To:        freebsd-questions@freebsd.org
Subject:   EVOLUTION  SLOW START , a workaround
Message-ID:  <1205268305.52059.16.camel@localhost>
In-Reply-To: <20080310231502.V7454@wojtek.tensor.gdynia.pl>
References:  <94136a2c0803101454l6ca76c99ma1fa1083d7ea2137@mail.gmail.com> <20080310231502.V7454@wojtek.tensor.gdynia.pl>

next in thread | previous in thread | raw e-mail | index | archive | help
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);





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1205268305.52059.16.camel>