From 3e2e2d717c50259d9b95c8c04332b78f666acf6d Mon Sep 17 00:00:00 2001 From: Harald Wolff-Thobaben Date: Wed, 14 Dec 2022 14:09:02 +0100 Subject: [PATCH] Fixed multithreading safety on JsonMapper --- ln.json/ln.json.csproj | 2 +- ln.json/mapping/JSONMapper.cs | 38 ++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/ln.json/ln.json.csproj b/ln.json/ln.json.csproj index df10548..4c37b94 100644 --- a/ln.json/ln.json.csproj +++ b/ln.json/ln.json.csproj @@ -9,7 +9,7 @@ true 0.1.0.0 0.1.0.0 - 1.2.1 + 1.2.2 net5.0;net6.0 diff --git a/ln.json/mapping/JSONMapper.cs b/ln.json/mapping/JSONMapper.cs index f14e1b5..db06040 100644 --- a/ln.json/mapping/JSONMapper.cs +++ b/ln.json/mapping/JSONMapper.cs @@ -54,7 +54,14 @@ namespace ln.json.mapping Dictionary mappings = new Dictionary(); - public virtual void Add(JSONMapping mapping) => mappings[mapping.TargetType] = mapping; + + public virtual void Add(JSONMapping mapping) + { + lock (mappings) + { + mappings[mapping.TargetType] = mapping; + } + } Dictionary mappingFactories = new Dictionary(); public virtual void AddMappingFactory(Type targetType, MappingFactory mappingFactory) => mappingFactories.Add(targetType, mappingFactory); @@ -63,12 +70,16 @@ namespace ln.json.mapping public virtual bool TryBuildRememberedMapping(Type nativeType,out JSONMapping mapping) { - if (TryBuildMapping(nativeType, out mapping)) + lock (mappings) { - mappings.Add(nativeType, mapping); - return true; + if (TryBuildMapping(nativeType, out mapping)) + { + mappings.Add(nativeType, mapping); + return true; + } + + return false; } - return false; } public virtual bool TryBuildMapping(Type nativeType,out JSONMapping mapping) { @@ -119,16 +130,19 @@ namespace ln.json.mapping public virtual bool TryGetMapping(Type nativeType,out JSONMapping mapping) { - if (mappings.TryGetValue(nativeType, out mapping)) - return true; + lock (mappings) + { + if (mappings.TryGetValue(nativeType, out mapping)) + return true; - if (RequestCustomMapping(nativeType, out mapping)) - return true; + if (RequestCustomMapping(nativeType, out mapping)) + return true; - if ((this != DefaultMapper) && DefaultMapper.TryGetMapping(nativeType, out mapping)) - return true; + if ((this != DefaultMapper) && DefaultMapper.TryGetMapping(nativeType, out mapping)) + return true; - return false; + return false; + } }