i.e. see bug: https://bugzilla.redhat.com/show_bug.cgi?id=666088 for details.
Attached is the proposed fix. Don't let the fancy-pants rtl::Static put you off, its just making the maCache from a global to a static local. Globals/static locals have their dtors called in reverse order of the completion of their ctors. Leaving the complex global at its current scope means it gets shutdown too late on final dlclose of libunotools, at a point after which all the runtime structure that it needs has been shutdown. Changing it to a local static ensures it gets dtored before that. C.
>From b79c4f7daf165e4190b12a19382f4e5615b43163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caol...@redhat.com> Date: Thu, 6 Jan 2011 17:05:14 +0000 Subject: [PATCH] Resolves: rhbz#666088 clean up search cache singleton in correct order --- unotools/inc/unotools/textsearch.hxx | 9 -------- unotools/source/i18n/textsearch.cxx | 37 +++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/unotools/inc/unotools/textsearch.hxx b/unotools/inc/unotools/textsearch.hxx index 0aaa123..16ae82f 100644 --- a/unotools/inc/unotools/textsearch.hxx +++ b/unotools/inc/unotools/textsearch.hxx @@ -128,15 +128,6 @@ public: class UNOTOOLS_DLLPUBLIC TextSearch { - struct CachedTextSearch - { - ::osl::Mutex mutex; - ::com::sun::star::util::SearchOptions Options; - ::com::sun::star::uno::Reference< ::com::sun::star::util::XTextSearch > xTextSearch; - }; - - static CachedTextSearch maCache; - static ::com::sun::star::uno::Reference< ::com::sun::star::util::XTextSearch > getXTextSearch( const ::com::sun::star::util::SearchOptions& rPara ); diff --git a/unotools/source/i18n/textsearch.cxx b/unotools/source/i18n/textsearch.cxx index 8f8f780..8085045 100644 --- a/unotools/source/i18n/textsearch.cxx +++ b/unotools/source/i18n/textsearch.cxx @@ -36,6 +36,7 @@ #include <unotools/charclass.hxx> #include <comphelper/processfactory.hxx> #include <unotools/textsearch.hxx> +#include <rtl/instance.hxx> using namespace ::com::sun::star::util; using namespace ::com::sun::star::uno; @@ -86,13 +87,6 @@ SearchParam::SearchParam( const SearchParam& rParam ) nTransliterationFlags = rParam.nTransliterationFlags; } -// Klasse zum Suchen eines Strings in einem Text. Es wird genau nach -// dem String gesucht. -// ( Die Unterscheidung der Gross/Klein-Schreibung kann mit einen Flag -// unterdrueckt werden ) - -TextSearch::CachedTextSearch TextSearch::maCache; - static bool lcl_Equals( const SearchOptions& rSO1, const SearchOptions& rSO2 ) { return rSO1.algorithmType == rSO2.algorithmType && @@ -108,27 +102,42 @@ static bool lcl_Equals( const SearchOptions& rSO1, const SearchOptions& rSO2 ) rSO1.transliterateFlags == rSO2.transliterateFlags; } +namespace +{ + struct CachedTextSearch + { + ::osl::Mutex mutex; + ::com::sun::star::util::SearchOptions Options; + ::com::sun::star::uno::Reference< ::com::sun::star::util::XTextSearch > xTextSearch; + }; + + struct theCachedTextSearch + : public rtl::Static< CachedTextSearch, theCachedTextSearch > {}; +} + Reference<XTextSearch> TextSearch::getXTextSearch( const SearchOptions& rPara ) { - osl::MutexGuard aGuard(maCache.mutex); + CachedTextSearch &rCache = theCachedTextSearch::get(); + + osl::MutexGuard aGuard(rCache.mutex); - if ( lcl_Equals(maCache.Options, rPara) ) - return maCache.xTextSearch; + if ( lcl_Equals(rCache.Options, rPara) ) + return rCache.xTextSearch; try { Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); - maCache.xTextSearch.set( xMSF->createInstance( + rCache.xTextSearch.set( xMSF->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.TextSearch" ) ) ), UNO_QUERY_THROW ); - maCache.xTextSearch->setOptions( rPara ); - maCache.Options = rPara; + rCache.xTextSearch->setOptions( rPara ); + rCache.Options = rPara; } catch ( Exception& ) { DBG_ERRORFILE( "TextSearch ctor: Exception caught!" ); } - return maCache.xTextSearch; + return rCache.xTextSearch; } TextSearch::TextSearch(const SearchParam & rParam, LanguageType eLang ) -- 1.7.3.3
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice