Index: base/i18n/rtl.cc |
diff --git a/base/i18n/rtl.cc b/base/i18n/rtl.cc |
index 2b6bf37706fd4ad52b28024427fa0451fc121c9d..07fd9642d37d203689c86e2083cf6052f1cf515e 100644 |
--- a/base/i18n/rtl.cc |
+++ b/base/i18n/rtl.cc |
@@ -9,6 +9,7 @@ |
#include <algorithm> |
+#include "base/atomicops.h" |
#include "base/command_line.h" |
#include "base/files/file_path.h" |
#include "base/i18n/base_i18n_switches.h" |
@@ -113,7 +114,8 @@ namespace base { |
namespace i18n { |
// Represents the locale-specific ICU text direction. |
-static TextDirection g_icu_text_direction = UNKNOWN_DIRECTION; |
+static subtle::Atomic32 g_icu_text_direction = |
+ static_cast<subtle::Atomic32>(UNKNOWN_DIRECTION); |
// Convert the ICU default locale to a string. |
std::string GetConfiguredLocale() { |
@@ -162,7 +164,10 @@ void SetICUDefaultLocale(const std::string& locale_string) { |
// presence of actual locale data). However, |
// it does not hurt to have it as a sanity check. |
DCHECK(U_SUCCESS(error_code)); |
- g_icu_text_direction = UNKNOWN_DIRECTION; |
+ subtle::Release_Store( |
+ &g_icu_text_direction, |
+ static_cast<subtle::Atomic32>( |
+ GetTextDirectionForLocaleInStartUp(locale.getName()))); |
} |
bool IsRTL() { |
@@ -170,11 +175,11 @@ bool IsRTL() { |
} |
bool ICUIsRTL() { |
- if (g_icu_text_direction == UNKNOWN_DIRECTION) { |
- const icu::Locale& locale = icu::Locale::getDefault(); |
- g_icu_text_direction = GetTextDirectionForLocaleInStartUp(locale.getName()); |
- } |
- return g_icu_text_direction == RIGHT_TO_LEFT; |
+ // Note: There is still a race if this is executed between the |
+ // icu::Locale::setDefault and the g_icu_text_direction store |
+ // that happens in SetICUDefaultLocale. |
+ return static_cast<TextDirection>( |
+ subtle::Acquire_Load(&g_icu_text_direction)) == RIGHT_TO_LEFT; |
} |
TextDirection GetTextDirectionForLocaleInStartUp(const char* locale_name) { |