[PATCH] Resolves: rhbz#666088 clean up search cache singleton in correct order

Caolán McNamara caolanm at redhat.com
Thu Jan 6 09:05:14 PST 2011


---
 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


--=-+TKLV32tB4PQNOM0IDHQ--



More information about the LibreOffice mailing list