summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2018-01-19 20:06:39 -0800
committerGitHub <noreply@github.com>2018-01-19 20:06:39 -0800
commita4af006ff55af59ac5d28f0b4faffdc1806dc89a (patch)
tree60c11ed30f42b56258265400996e8a8611e43d0c /src
parent128893e65c3e748e2ac9b85cbc6e0560cf84e2e1 (diff)
downloadcoreclr-a4af006ff55af59ac5d28f0b4faffdc1806dc89a.tar.gz
coreclr-a4af006ff55af59ac5d28f0b4faffdc1806dc89a.tar.bz2
coreclr-a4af006ff55af59ac5d28f0b4faffdc1806dc89a.zip
Break current culture initialization cycle (#15938)
Fixes #15931
Diffstat (limited to 'src')
-rw-r--r--src/mscorlib/src/System/Globalization/CultureInfo.Unix.cs12
-rw-r--r--src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs12
-rw-r--r--src/mscorlib/src/System/Globalization/CultureInfo.cs53
3 files changed, 18 insertions, 59 deletions
diff --git a/src/mscorlib/src/System/Globalization/CultureInfo.Unix.cs b/src/mscorlib/src/System/Globalization/CultureInfo.Unix.cs
index 7a8a9fd08d..719cc7532f 100644
--- a/src/mscorlib/src/System/Globalization/CultureInfo.Unix.cs
+++ b/src/mscorlib/src/System/Globalization/CultureInfo.Unix.cs
@@ -34,7 +34,7 @@ namespace System.Globalization
return cultureInfo;
}
- private static CultureInfo GetUserDefaultUILanguage()
+ private static CultureInfo GetUserDefaultUICulture()
{
return GetUserDefaultCulture();
}
@@ -73,15 +73,7 @@ namespace System.Globalization
return ci;
}
- // if s_userDefaultCulture == null means CultureInfo statics didn't get initialized yet. this can happen if there early static
- // method get executed which eventually hit the cultureInfo code while CultureInfo statics didn’t get chance to initialize
- if (s_userDefaultCulture == null)
- {
- Init();
- }
-
- Debug.Assert(s_userDefaultCulture != null);
- return s_userDefaultCulture;
+ return s_userDefaultCulture ?? InitializeUserDefaultCulture();
}
set
diff --git a/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs b/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs
index 88f6b28d6a..d9ce874ad4 100644
--- a/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs
+++ b/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs
@@ -72,7 +72,7 @@ namespace System.Globalization
return temp;
}
- private static CultureInfo GetUserDefaultUILanguage()
+ private static CultureInfo GetUserDefaultUICulture()
{
if (GlobalizationMode.Invariant)
return CultureInfo.InvariantCulture;
@@ -150,15 +150,7 @@ namespace System.Globalization
return ci;
}
- // if s_userDefaultCulture == null means CultureInfo statics didn't get initialized yet. this can happen if there early static
- // method get executed which eventually hit the cultureInfo code while CultureInfo statics didn’t get chance to initialize
- if (s_userDefaultCulture == null)
- {
- Init();
- }
-
- Debug.Assert(s_userDefaultCulture != null);
- return s_userDefaultCulture;
+ return s_userDefaultCulture ?? InitializeUserDefaultCulture();
}
set
diff --git a/src/mscorlib/src/System/Globalization/CultureInfo.cs b/src/mscorlib/src/System/Globalization/CultureInfo.cs
index 2c9327770b..83a261fc65 100644
--- a/src/mscorlib/src/System/Globalization/CultureInfo.cs
+++ b/src/mscorlib/src/System/Globalization/CultureInfo.cs
@@ -148,17 +148,16 @@ namespace System.Globalization
internal const int LOCALE_CUSTOM_DEFAULT = 0x0c00;
internal const int LOCALE_INVARIANT = 0x007F;
- //
- // The CultureData instance that reads the data provided by our CultureData class.
- //
- // Using a field initializer rather than a static constructor so that the whole class can be lazy
- // init.
- private static readonly bool init = Init();
- private static bool Init()
+ private static CultureInfo InitializeUserDefaultCulture()
{
- s_userDefaultCulture = GetUserDefaultCulture();
- s_userDefaultUICulture = GetUserDefaultUILanguage();
- return true;
+ Interlocked.CompareExchange(ref s_userDefaultCulture, GetUserDefaultCulture(), null);
+ return s_userDefaultCulture;
+ }
+
+ private static CultureInfo InitializeUserDefaultUICulture()
+ {
+ Interlocked.CompareExchange(ref s_userDefaultUICulture, GetUserDefaultUICulture(), null);
+ return s_userDefaultUICulture;
}
////////////////////////////////////////////////////////////////////////
@@ -167,7 +166,6 @@ namespace System.Globalization
//
////////////////////////////////////////////////////////////////////////
-
public CultureInfo(String name)
: this(name, true)
{
@@ -423,34 +421,9 @@ namespace System.Globalization
return UserDefaultUICulture;
}
- internal static CultureInfo UserDefaultUICulture
- {
- get
- {
- // if s_userDefaultUICulture == null means CultureInfo statics didn't get initialized yet. this can happen if there early static
- // method get executed which eventually hit the cultureInfo code while CultureInfo statics didn’t get chance to initialize
- if (s_userDefaultUICulture == null)
- {
- Init();
- }
-
- Debug.Assert(s_userDefaultUICulture != null);
- return s_userDefaultUICulture;
- }
- }
+ internal static CultureInfo UserDefaultUICulture => s_userDefaultUICulture ?? InitializeUserDefaultUICulture();
- public static CultureInfo InstalledUICulture
- {
- get
- {
- if (s_userDefaultCulture == null)
- {
- Init();
- }
- Debug.Assert(s_userDefaultCulture != null, "[CultureInfo.InstalledUICulture] s_userDefaultCulture != null");
- return s_userDefaultCulture;
- }
- }
+ public static CultureInfo InstalledUICulture => s_userDefaultCulture ?? InitializeUserDefaultCulture();
public static CultureInfo DefaultThreadCurrentCulture
{
@@ -920,7 +893,9 @@ namespace System.Globalization
public void ClearCachedData()
{
- Init(); // reset the default culture values
+ // reset the default culture values
+ s_userDefaultCulture = GetUserDefaultCulture();
+ s_userDefaultUICulture = GetUserDefaultUICulture();
RegionInfo.s_currentRegionInfo = null;
#pragma warning disable 0618 // disable the obsolete warning