Skip to content

Commit c3b5bd0

Browse files
authored
Merge pull request #962 from EdwardCooke/ec-makeconcurrent
Made the typeconvertercache a concurrent dictionary +semver:fix
2 parents fc77398 + 5737a3c commit c3b5bd0

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

YamlDotNet/Serialization/Utilities/TypeConverterCache.cs

+9-11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
// SOFTWARE.
2121

2222
using System;
23+
using System.Collections.Concurrent;
2324
using System.Collections.Generic;
2425
using System.Diagnostics.CodeAnalysis;
2526
using System.Linq;
@@ -32,7 +33,7 @@ namespace YamlDotNet.Serialization.Utilities
3233
internal sealed class TypeConverterCache
3334
{
3435
private readonly IYamlTypeConverter[] typeConverters;
35-
private readonly Dictionary<Type, (bool HasMatch, IYamlTypeConverter TypeConverter)> cache = new();
36+
private readonly ConcurrentDictionary<Type, (bool HasMatch, IYamlTypeConverter? TypeConverter)> cache = new();
3637

3738
public TypeConverterCache(IEnumerable<IYamlTypeConverter>? typeConverters) : this(typeConverters?.ToArray() ?? Array.Empty<IYamlTypeConverter>())
3839
{
@@ -51,18 +52,15 @@ public TypeConverterCache(IYamlTypeConverter[] typeConverters)
5152
/// <returns><see langword="true"/> if a type converter was found; <see langword="false"/> otherwise.</returns>
5253
public bool TryGetConverterForType(Type type, [NotNullWhen(true)] out IYamlTypeConverter? typeConverter)
5354
{
54-
if (cache.TryGetValue(type, out var result))
55+
var result = cache.GetOrAdd(type, (t) =>
5556
{
56-
typeConverter = result.TypeConverter;
57-
return result.HasMatch;
58-
}
59-
60-
typeConverter = LookupTypeConverter(type);
61-
62-
var found = typeConverter is not null;
63-
cache[type] = (found, typeConverter!);
57+
var converter = LookupTypeConverter(type);
58+
var found = converter != null;
59+
return (found, converter);
60+
});
6461

65-
return found;
62+
typeConverter = result.TypeConverter;
63+
return result.HasMatch;
6664
}
6765

6866
/// <summary>

0 commit comments

Comments
 (0)