Makes CultureInfo.get_Parent thread safe. (#21671)
authorFilip Navara <filip.navara@gmail.com>
Tue, 25 Dec 2018 04:55:30 +0000 (05:55 +0100)
committerJan Kotas <jkotas@microsoft.com>
Tue, 25 Dec 2018 04:55:30 +0000 (18:55 -1000)
src/System.Private.CoreLib/src/System/Globalization/CultureInfo.cs

index f0da4bf..84d7ac2 100644 (file)
@@ -495,23 +495,26 @@ namespace System.Globalization
             {
                 if (null == _parent)
                 {
             {
                 if (null == _parent)
                 {
+                    CultureInfo culture = null;
                     string parentName = _cultureData.SPARENT;
 
                     if (string.IsNullOrEmpty(parentName))
                     {
                     string parentName = _cultureData.SPARENT;
 
                     if (string.IsNullOrEmpty(parentName))
                     {
-                        _parent = InvariantCulture;
+                        culture = InvariantCulture;
                     }
                     else
                     {
                     }
                     else
                     {
-                        _parent = CreateCultureInfoNoThrow(parentName, _cultureData.UseUserOverride);
-                        if (_parent == null)
+                        culture = CreateCultureInfoNoThrow(parentName, _cultureData.UseUserOverride);
+                        if (culture == null)
                         {
                             // For whatever reason our IPARENT or SPARENT wasn't correct, so use invariant
                             // We can't allow ourselves to fail.  In case of custom cultures the parent of the
                             // current custom culture isn't installed.
                         {
                             // For whatever reason our IPARENT or SPARENT wasn't correct, so use invariant
                             // We can't allow ourselves to fail.  In case of custom cultures the parent of the
                             // current custom culture isn't installed.
-                            _parent = InvariantCulture;
+                            culture = InvariantCulture;
                         }
                     }
                         }
                     }
+
+                    Interlocked.CompareExchange<CultureInfo>(ref _parent, culture, null);
                 }
                 return _parent;
             }
                 }
                 return _parent;
             }