From 0de5b4523fb9b4fffda6eda2b8f5705a023fac0b Mon Sep 17 00:00:00 2001 From: Andy Heninger Date: Wed, 2 Jul 2014 22:31:05 +0000 Subject: [PATCH] ICU-10908 LocaleDisplayNames thread safety fix. X-SVN-Rev: 35989 --- icu4c/source/i18n/locdspnm.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/icu4c/source/i18n/locdspnm.cpp b/icu4c/source/i18n/locdspnm.cpp index d99964ebbd9..4fb196c7cdc 100644 --- a/icu4c/source/i18n/locdspnm.cpp +++ b/icu4c/source/i18n/locdspnm.cpp @@ -17,7 +17,9 @@ #include "cmemory.h" #include "cstring.h" +#include "mutex.h" #include "ulocimp.h" +#include "umutex.h" #include "ureslocs.h" #include "uresimp.h" @@ -277,6 +279,7 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { MessageFormat *keyTypeFormat; UDisplayContext capitalizationContext; BreakIterator* capitalizationBrkIter; + static UMutex capitalizationBrkIterLock; UnicodeString formatOpenParen; UnicodeString formatReplaceOpenParen; UnicodeString formatCloseParen; @@ -333,6 +336,8 @@ private: void initialize(void); }; +UMutex LocaleDisplayNamesImpl::capitalizationBrkIterLock = U_MUTEX_INITIALIZER; + LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, UDialectHandling dialectHandling) : dialectHandling(dialectHandling) @@ -520,6 +525,7 @@ LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage, if ( result.length() > 0 && u_islower(result.char32At(0)) && capitalizationBrkIter!= NULL && ( capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || fCapitalization[usage] ) ) { // note fCapitalization[usage] won't be set unless capitalizationContext is UI_LIST_OR_MENU or STANDALONE + Mutex lock(&capitalizationBrkIterLock); result.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); } #endif -- 2.40.0