summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTarek Mahmoud Sayed <tarekms@microsoft.com>2016-04-06 16:24:35 -0700
committerTarek Mahmoud Sayed <tarekms@microsoft.com>2016-04-06 16:24:35 -0700
commite609a4f2272412f0ad3ce1f8e22c2b4d0740388f (patch)
tree73d72f9018d13527017f7aedcfe61a381e364a42 /src
parente3ad4b489429edd6d7f8315e0bc218c32bf6315f (diff)
parent6d62f71aa8eef7e5fd88176f0048f00cfcda24cf (diff)
downloadcoreclr-e609a4f2272412f0ad3ce1f8e22c2b4d0740388f.tar.gz
coreclr-e609a4f2272412f0ad3ce1f8e22c2b4d0740388f.tar.bz2
coreclr-e609a4f2272412f0ad3ce1f8e22c2b4d0740388f.zip
Merge pull request #4119 from tarekgh/FixAsyncCurrentCulture
Make current culture travel with async operations on Linux
Diffstat (limited to 'src')
-rw-r--r--src/mscorlib/corefx/System/Globalization/CultureInfo.cs29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/mscorlib/corefx/System/Globalization/CultureInfo.cs b/src/mscorlib/corefx/System/Globalization/CultureInfo.cs
index 2be61f69dc..e5e01be032 100644
--- a/src/mscorlib/corefx/System/Globalization/CultureInfo.cs
+++ b/src/mscorlib/corefx/System/Globalization/CultureInfo.cs
@@ -133,6 +133,19 @@ namespace System.Globalization
//The parent culture.
private CultureInfo m_parent;
+ static AsyncLocal<CultureInfo> s_asyncLocalCurrentCulture;
+ static AsyncLocal<CultureInfo> s_asyncLocalCurrentUICulture;
+
+ static void AsyncLocalSetCurrentCulture(AsyncLocalValueChangedArgs<CultureInfo> args)
+ {
+ s_currentThreadCulture = args.CurrentValue;
+ }
+
+ static void AsyncLocalSetCurrentUICulture(AsyncLocalValueChangedArgs<CultureInfo> args)
+ {
+ s_currentThreadUICulture = args.CurrentValue;
+ }
+
//
// The CultureData instance that reads the data provided by our CultureData class.
//
@@ -311,7 +324,13 @@ namespace System.Globalization
{
throw new ArgumentNullException("value");
}
- s_currentThreadCulture = value;
+
+ if (s_asyncLocalCurrentCulture == null)
+ {
+ Interlocked.CompareExchange(ref s_asyncLocalCurrentCulture, new AsyncLocal<CultureInfo>(AsyncLocalSetCurrentCulture), null);
+ }
+ // this one will set s_currentThreadCulture too
+ s_asyncLocalCurrentCulture.Value = value;
}
}
@@ -355,8 +374,14 @@ namespace System.Globalization
}
CultureInfo.VerifyCultureName(value, true);
+
+ if (s_asyncLocalCurrentUICulture == null)
+ {
+ Interlocked.CompareExchange(ref s_asyncLocalCurrentUICulture, new AsyncLocal<CultureInfo>(AsyncLocalSetCurrentUICulture), null);
+ }
- s_currentThreadUICulture = value;
+ // this one will set s_currentThreadUICulture too
+ s_asyncLocalCurrentUICulture.Value = value;
}
}