diff --git a/components/l10n/messagebundles.cpp b/components/l10n/messagebundles.cpp index 7d37b4358f..7a0799f21d 100644 --- a/components/l10n/messagebundles.cpp +++ b/components/l10n/messagebundles.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -257,17 +258,24 @@ namespace L10n const icu::MessageFormat* MessageBundles::findMessage(std::string_view key, std::string_view localeName) const { - auto iter = mBundles.find(localeName); - if (iter != mBundles.end()) + std::shared_lock sharedLock(mMutex); { - auto message = iter->second.find(key); - if (message != iter->second.end()) + auto iter = mBundles.find(localeName); + if (iter != mBundles.end()) { - return &(message->second); + auto message = iter->second.find(key); + if (message != iter->second.end()) + { + return &(message->second); + } } } if (localeName == "gmst" && mGmstLoader) { + if (!mGmsts.contains(key)) + return nullptr; + sharedLock.unlock(); + std::unique_lock lock(mMutex); auto found = mGmsts.find(key); if (found != mGmsts.end()) { @@ -275,6 +283,7 @@ namespace L10n mGmsts.erase(found); if (message) { + auto iter = mBundles.find(localeName); if (iter == mBundles.end()) iter = mBundles.emplace(localeName, StringMap()).first; return &iter->second.emplace(key, *message).first->second; diff --git a/components/l10n/messagebundles.hpp b/components/l10n/messagebundles.hpp index ef4ce49cee..ac67c94ff0 100644 --- a/components/l10n/messagebundles.hpp +++ b/components/l10n/messagebundles.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -65,6 +66,7 @@ namespace L10n // icu::Locale isn't hashable (or comparable), so we use the string form instead, which is canonicalized mutable StringMap> mBundles; mutable StringMap mGmsts; + mutable std::shared_mutex mMutex; const icu::Locale mFallbackLocale; std::vector mPreferredLocaleStrings; std::vector mPreferredLocales;