i18npool/inc/cclass_unicode.hxx | 6 +++- i18npool/inc/transliteration_body.hxx | 11 ++++++- i18npool/source/characterclassification/cclass_unicode.cxx | 19 ++++++++----- i18npool/source/transliteration/transliteration_body.cxx | 9 ------ 4 files changed, 27 insertions(+), 18 deletions(-)
New commits: commit 0a790ba991daa9c84f836fd18290f621ea372460 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sat Mar 12 14:50:28 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Sat Mar 12 21:16:48 2022 +0100 tdf#147905 calc PROPER function doesn't like mulithreading regression from commit dac29c278531d5474289eb54aa03987c4958ac83 Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Thu Sep 16 11:03:04 2021 +0200 if you hit Transliteration_casemapping hard enough, like in this test case, the state changes become a problem, so remove that by having multiple copies. Change-Id: I1d795af4370d6f79468387997202ba11c6a9d7b5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131441 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/i18npool/inc/cclass_unicode.hxx b/i18npool/inc/cclass_unicode.hxx index 3cfa1475a063..a10fe84eb8d9 100644 --- a/i18npool/inc/cclass_unicode.hxx +++ b/i18npool/inc/cclass_unicode.hxx @@ -94,7 +94,11 @@ public: virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; private: - rtl::Reference<Transliteration_casemapping> trans; + // These are performance sensitive, so we don't want to use locking and switch their state, so just + // have multiple copies. + rtl::Reference<Transliteration_casemapping> transToUpper; + rtl::Reference<Transliteration_casemapping> transToLower; + rtl::Reference<Transliteration_casemapping> transToTitle; // --- parser specific (implemented in cclass_unicode_parser.cxx) --- diff --git a/i18npool/inc/transliteration_body.hxx b/i18npool/inc/transliteration_body.hxx index a53aa77d15d2..6c3418fd7994 100644 --- a/i18npool/inc/transliteration_body.hxx +++ b/i18npool/inc/transliteration_body.hxx @@ -70,7 +70,16 @@ class Transliteration_casemapping final : public Transliteration_body { public: Transliteration_casemapping(); - void setMappingType(const MappingType rMappingType, const css::lang::Locale& rLocale ); + void setMappingType( const MappingType rMappingType ) + { + if (nMappingType != rMappingType) + nMappingType = rMappingType; + } + void setLocale( const css::lang::Locale& rLocale ) + { + if (aLocale != rLocale) + aLocale = rLocale; + } }; class Transliteration_togglecase final : public Transliteration_body diff --git a/i18npool/source/characterclassification/cclass_unicode.cxx b/i18npool/source/characterclassification/cclass_unicode.cxx index 45f222c60f6f..6c44d0f517fe 100644 --- a/i18npool/source/characterclassification/cclass_unicode.cxx +++ b/i18npool/source/characterclassification/cclass_unicode.cxx @@ -39,7 +39,9 @@ namespace i18npool { // ----------------------------------------------------; cclass_Unicode::cclass_Unicode( const uno::Reference < XComponentContext >& rxContext ) : - trans( new Transliteration_casemapping() ), + transToUpper( new Transliteration_casemapping() ), + transToLower( new Transliteration_casemapping() ), + transToTitle( new Transliteration_casemapping() ), m_xContext( rxContext ), nStartTypes( 0 ), nContTypes( 0 ), @@ -47,6 +49,9 @@ cclass_Unicode::cclass_Unicode( const uno::Reference < XComponentContext >& rxCo cDecimalSep( '.' ), cDecimalSepAlt( 0 ) { + transToUpper->setMappingType(MappingType::ToUpper); + transToLower->setMappingType(MappingType::ToLower); + transToTitle->setMappingType(MappingType::ToTitle); } cclass_Unicode::~cclass_Unicode() { @@ -62,8 +67,8 @@ cclass_Unicode::toUpper( const OUString& Text, sal_Int32 nPos, sal_Int32 nCount, if (nCount + nPos > len) nCount = len - nPos; - trans->setMappingType(MappingType::ToUpper, rLocale); - return trans->transliterateString2String(Text, nPos, nCount); + transToUpper->setLocale(rLocale); + return transToUpper->transliterateString2String(Text, nPos, nCount); } OUString SAL_CALL @@ -74,8 +79,8 @@ cclass_Unicode::toLower( const OUString& Text, sal_Int32 nPos, sal_Int32 nCount, if (nCount + nPos > len) nCount = len - nPos; - trans->setMappingType(MappingType::ToLower, rLocale); - return trans->transliterateString2String(Text, nPos, nCount); + transToLower->setLocale(rLocale); + return transToLower->transliterateString2String(Text, nPos, nCount); } OUString SAL_CALL @@ -88,7 +93,7 @@ cclass_Unicode::toTitle( const OUString& Text, sal_Int32 nPos, sal_Int32 nCount, if (nCount + nPos > len) nCount = len - nPos; - trans->setMappingType(MappingType::ToTitle, rLocale); + transToTitle->setLocale(rLocale); rtl_uString* pStr = rtl_uString_alloc(nCount); sal_Unicode* out = pStr->buffer; rtl::Reference< BreakIteratorImpl > xBrk(new BreakIteratorImpl(m_xContext)); @@ -99,7 +104,7 @@ cclass_Unicode::toTitle( const OUString& Text, sal_Int32 nPos, sal_Int32 nCount, bdy = xBrk->nextWord(Text, bdy.endPos, rLocale, WordType::ANYWORD_IGNOREWHITESPACES); *out = (i == bdy.startPos) ? - trans->transliterateChar2Char(Text[i]) : Text[i]; + transToTitle->transliterateChar2Char(Text[i]) : Text[i]; } *out = 0; return OUString( pStr, SAL_NO_ACQUIRE ); diff --git a/i18npool/source/transliteration/transliteration_body.cxx b/i18npool/source/transliteration/transliteration_body.cxx index 80072219780c..9b05f05b585c 100644 --- a/i18npool/source/transliteration/transliteration_body.cxx +++ b/i18npool/source/transliteration/transliteration_body.cxx @@ -191,15 +191,6 @@ Transliteration_casemapping::Transliteration_casemapping() implementationName = "com.sun.star.i18n.Transliteration.Transliteration_casemapping"; } -void -Transliteration_casemapping::setMappingType( const MappingType rMappingType, const Locale& rLocale ) -{ - if (nMappingType != rMappingType) - nMappingType = rMappingType; - if (aLocale != rLocale) - aLocale = rLocale; -} - Transliteration_u2l::Transliteration_u2l() { nMappingType = MappingType::UpperToLower;