Move StringBuilderCache to shared (dotnet/coreclr#17964)
authorStephen Toub <stoub@microsoft.com>
Fri, 11 May 2018 17:31:46 +0000 (13:31 -0400)
committerGitHub <noreply@github.com>
Fri, 11 May 2018 17:31:46 +0000 (13:31 -0400)
Commit migrated from https://github.com/dotnet/coreclr/commit/3bfaf1f10dfc60972ee4e6116eb8607ecd1554df

src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj
src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilderCache.cs [deleted file]
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
src/libraries/System.Private.CoreLib/src/System/Text/StringBuilderCache.cs [new file with mode: 0644]

index 244b9f8..a06cf25 100644 (file)
     <Compile Include="$(BclSourcesRoot)\System\ThrowHelper.cs" />
     <Compile Include="$(BclSourcesRoot)\System\String.CoreCLR.cs" />
     <Compile Include="$(BclSourcesRoot)\System\Text\StringBuilder.CoreCLR.cs" />
-    <Compile Include="$(BclSourcesRoot)\System\Text\StringBuilderCache.cs" />
     <Compile Include="$(BclSourcesRoot)\System\Exception.cs" />
     <Compile Include="$(BclSourcesRoot)\System\DateTime.CoreCLR.cs" />
     <Compile Include="$(BclSourcesRoot)\System\OutOfMemoryException.cs" />
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilderCache.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilderCache.cs
deleted file mode 100644 (file)
index a8a5e2c..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*============================================================
-**
-**
-** Purpose: provide a cached reusable instance of stringbuilder
-**          per thread  it's an optimisation that reduces the 
-**          number of instances constructed and collected.
-**
-**  Acquire - is used to get a string builder to use of a 
-**            particular size.  It can be called any number of 
-**            times, if a stringbuilder is in the cache then
-**            it will be returned and the cache emptied.
-**            subsequent calls will return a new stringbuilder.
-**
-**            A StringBuilder instance is cached in 
-**            Thread Local Storage and so there is one per thread
-**
-**  Release - Place the specified builder in the cache if it is 
-**            not too big.
-**            The stringbuilder should not be used after it has 
-**            been released.
-**            Unbalanced Releases are perfectly acceptable.  It
-**            will merely cause the runtime to create a new 
-**            stringbuilder next time Acquire is called.
-**
-**  GetStringAndRelease
-**          - ToString() the stringbuilder, Release it to the 
-**            cache and return the resulting string
-**
-===========================================================*/
-
-using System.Threading;
-
-namespace System.Text
-{
-    internal static class StringBuilderCache
-    {
-        // The value 360 was chosen in discussion with performance experts as a compromise between using
-        // as litle memory (per thread) as possible and still covering a large part of short-lived
-        // StringBuilder creations on the startup path of VS designers.
-        private const int MAX_BUILDER_SIZE = 360;
-
-        [ThreadStatic]
-        private static StringBuilder CachedInstance;
-
-        public static StringBuilder Acquire(int capacity = StringBuilder.DefaultCapacity)
-        {
-            if (capacity <= MAX_BUILDER_SIZE)
-            {
-                StringBuilder sb = StringBuilderCache.CachedInstance;
-                if (sb != null)
-                {
-                    // Avoid stringbuilder block fragmentation by getting a new StringBuilder
-                    // when the requested size is larger than the current capacity
-                    if (capacity <= sb.Capacity)
-                    {
-                        StringBuilderCache.CachedInstance = null;
-                        sb.Clear();
-                        return sb;
-                    }
-                }
-            }
-            return new StringBuilder(capacity);
-        }
-
-        public static void Release(StringBuilder sb)
-        {
-            if (sb.Capacity <= MAX_BUILDER_SIZE)
-            {
-                StringBuilderCache.CachedInstance = sb;
-            }
-        }
-
-        public static string GetStringAndRelease(StringBuilder sb)
-        {
-            string result = sb.ToString();
-            Release(sb);
-            return result;
-        }
-    }
-}
index ca804e3..6b80071 100644 (file)
     <Compile Include="$(MSBuildThisFileDirectory)System\StringSplitOptions.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\SystemException.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\Text\ASCIIEncoding.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)System\Text\StringBuilderCache.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\Text\Decoder.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\Text\DecoderNLS.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\Text\DecoderBestFitFallback.cs" />
diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/StringBuilderCache.cs b/src/libraries/System.Private.CoreLib/src/System/Text/StringBuilderCache.cs
new file mode 100644 (file)
index 0000000..e699cc2
--- /dev/null
@@ -0,0 +1,62 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace System.Text
+{
+    /// <summary>Provide a cached reusable instance of stringbuilder per thread.</summary>
+    internal static class StringBuilderCache
+    {
+        // The value 360 was chosen in discussion with performance experts as a compromise between using
+        // as litle memory per thread as possible and still covering a large part of short-lived
+        // StringBuilder creations on the startup path of VS designers.
+        private const int MaxBuilderSize = 360;
+        private const int DefaultCapacity = 16; // == StringBuilder.DefaultCapacity
+
+        // WARNING: We allow diagnostic tools to directly inspect this member (t_cachedInstance).
+        // See https://github.com/dotnet/corert/blob/master/Documentation/design-docs/diagnostics/diagnostics-tools-contract.md for more details. 
+        // Please do not change the type, the name, or the semantic usage of this member without understanding the implication for tools. 
+        // Get in touch with the diagnostics team if you have questions.
+        [ThreadStatic]
+        private static StringBuilder t_cachedInstance;
+
+        /// <summary>Get a StringBuilder for the specified capacity.</summary>
+        /// <remarks>If a StringBuilder of an appropriate size is cached, it will be returned and the cache emptied.</remarks>
+        public static StringBuilder Acquire(int capacity = DefaultCapacity)
+        {
+            if (capacity <= MaxBuilderSize)
+            {
+                StringBuilder sb = t_cachedInstance;
+                if (sb != null)
+                {
+                    // Avoid stringbuilder block fragmentation by getting a new StringBuilder
+                    // when the requested size is larger than the current capacity
+                    if (capacity <= sb.Capacity)
+                    {
+                        t_cachedInstance = null;
+                        sb.Clear();
+                        return sb;
+                    }
+                }
+            }
+            return new StringBuilder(capacity);
+        }
+
+        /// <summary>Place the specified builder in the cache if it is not too big.</summary>
+        public static void Release(StringBuilder sb)
+        {
+            if (sb.Capacity <= MaxBuilderSize)
+            {
+                t_cachedInstance = sb;
+            }
+        }
+
+        /// <summary>ToString() the stringbuilder, Release it to the cache, and return the resulting string.</summary>
+        public static string GetStringAndRelease(StringBuilder sb)
+        {
+            string result = sb.ToString();
+            Release(sb);
+            return result;
+        }
+    }
+}