Skip to content

Commit f7bfc79

Browse files
authored
make the builder cache thread safe (#49731)
1 parent e6b004b commit f7bfc79

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

sdk/core/System.ClientModel/gen/ModelReaderWriterContextGenerator.Emitter.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System.Collections;
5+
using System.Collections.Concurrent;
56
using System.Collections.Generic;
67
using System.Text;
78
using Microsoft.CodeAnalysis.Text;
@@ -31,6 +32,7 @@ private void EmitContextClass(ModelReaderWriterContextGenerationSpec contextGene
3132
{
3233
var contextName = contextGenerationSpec.Type.Name;
3334
var namespaces = GetNameSpaces(contextGenerationSpec);
35+
namespaces.Add("System.Collections.Concurrent");
3436

3537
var indent = 0;
3638
var builder = new StringBuilder();
@@ -59,7 +61,7 @@ private void EmitContextClass(ModelReaderWriterContextGenerationSpec contextGene
5961
builder.AppendLine($"{s_modelReaderWriterTypeBuilder}>> _typeBuilderFactories = new();");
6062

6163
builder.Append(indent, "private readonly ");
62-
builder.AppendType(typeof(Dictionary<,>));
64+
builder.AppendType(typeof(ConcurrentDictionary<,>));
6365
builder.Append("<");
6466
builder.AppendType(typeof(Type));
6567
builder.Append(", ");
@@ -134,7 +136,7 @@ private void EmitContextClass(ModelReaderWriterContextGenerationSpec contextGene
134136
builder.AppendLine(indent, "{");
135137
indent++;
136138
builder.AppendLine(indent, "builder = factory();");
137-
builder.AppendLine(indent, "_typeBuilders.Add(type, builder);");
139+
builder.AppendLine(indent, "_typeBuilders.TryAdd(type, builder);");
138140
builder.AppendLine(indent, "return true;");
139141
indent--;
140142
builder.AppendLine(indent, "}");
@@ -147,7 +149,7 @@ private void EmitContextClass(ModelReaderWriterContextGenerationSpec contextGene
147149
builder.AppendLine(indent, $"if (kvp.Value.TryGetTypeBuilder(type, out builder))");
148150
builder.AppendLine(indent, "{");
149151
indent++;
150-
builder.AppendLine(indent, $"_typeBuilders.Add(type, builder);");
152+
builder.AppendLine(indent, $"_typeBuilders.TryAdd(type, builder);");
151153
builder.AppendLine(indent, "return true;");
152154
indent--;
153155
builder.AppendLine(indent, "}");

sdk/core/System.ClientModel/tests/gen.unit/CompilationHelper.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System.ClientModel.Primitives;
5+
using System.Collections.Concurrent;
56
using System.Collections.Generic;
67
using System.Collections.Immutable;
78
using System.IO;
@@ -51,6 +52,7 @@ public static Compilation CreateCompilation(
5152
MetadataReference.CreateFromFile(Path.Combine(typeof(object).Assembly.Location, "..", "System.Runtime.dll")),
5253
MetadataReference.CreateFromFile(typeof(JsonSerializer).Assembly.Location),
5354
MetadataReference.CreateFromFile(typeof(BinaryData).Assembly.Location),
55+
MetadataReference.CreateFromFile(typeof(ConcurrentDictionary<,>).Assembly.Location),
5456
#if NETFRAMEWORK
5557
MetadataReference.CreateFromFile(Path.Combine(typeof(object).Assembly.Location, "..", "netstandard.dll")),
5658
MetadataReference.CreateFromFile(typeof(ReadOnlyMemory<>).Assembly.Location),

0 commit comments

Comments
 (0)