From owner-freebsd-questions@FreeBSD.ORG Tue Mar 11 20:45:15 2008 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 25BDB106566B for ; Tue, 11 Mar 2008 20:45:15 +0000 (UTC) (envelope-from lenzi@k1.com.br) Received: from netuno.levier.com.br (netuno.levier.com.br [201.47.3.162]) by mx1.freebsd.org (Postfix) with ESMTP id 9501F8FC1D for ; Tue, 11 Mar 2008 20:45:14 +0000 (UTC) (envelope-from lenzi@k1.com.br) Received: from levier.com.br (localhost [127.0.0.1]) by netuno.levier.com.br (8.14.2/8.14.1) with ESMTP id m2BJo10a046644 for ; Tue, 11 Mar 2008 17:45:12 -0300 (BRT) (envelope-from lenzi@k1.com.br) X-MessageWall-Score: 0 (levier.com.br) Received: from [192.168.32.172] (authenticated as lenzi) by levier.com.br (MessageWall 1.0.8) with SMTP; 11 Mar 2008 20:45:11 -0000 From: sergio lenzi To: freebsd-questions@freebsd.org In-Reply-To: <20080310231502.V7454@wojtek.tensor.gdynia.pl> References: <94136a2c0803101454l6ca76c99ma1fa1083d7ea2137@mail.gmail.com> <20080310231502.V7454@wojtek.tensor.gdynia.pl> Date: Tue, 11 Mar 2008 17:45:05 -0300 Message-Id: <1205268305.52059.16.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 FreeBSD GNOME Team Port Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: EVOLUTION SLOW START , a workaround X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Mar 2008 20:45:15 -0000 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);