From 5d33600901dd05efec0e3ce605a7607999e0956c Mon Sep 17 00:00:00 2001 From: Adam Scott Date: Fri, 16 Nov 2018 10:28:46 +0100 Subject: [PATCH] Adds lock for mono threadsafety issue --- .../Resolvers/DynamicObjectResolver.cs | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/Utf8Json/Resolvers/DynamicObjectResolver.cs b/src/Utf8Json/Resolvers/DynamicObjectResolver.cs index 8ba36e04..41198878 100644 --- a/src/Utf8Json/Resolvers/DynamicObjectResolver.cs +++ b/src/Utf8Json/Resolvers/DynamicObjectResolver.cs @@ -478,6 +478,7 @@ internal static class DynamicObjectTypeBuilder static readonly Regex SubtractFullNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=\w+, PublicKeyToken=\w+"); #endif + static readonly object gate = new object(); static int nameSequence = 0; @@ -522,34 +523,37 @@ internal static class DynamicObjectTypeBuilder public static object BuildFormatterToAssembly(DynamicAssembly assembly, IJsonFormatterResolver selfResolver, Func nameMutator, bool excludeNull) { - var ti = typeof(T).GetTypeInfo(); - - if (ti.IsNullable()) + lock (gate) { - ti = ti.GenericTypeArguments[0].GetTypeInfo(); + var ti = typeof(T).GetTypeInfo(); - var innerFormatter = selfResolver.GetFormatterDynamic(ti.AsType()); - if (innerFormatter == null) + if (ti.IsNullable()) { - return null; + ti = ti.GenericTypeArguments[0].GetTypeInfo(); + + var innerFormatter = selfResolver.GetFormatterDynamic(ti.AsType()); + if (innerFormatter == null) + { + return null; + } + return (IJsonFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter }); } - return (IJsonFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter }); - } - Type elementType; - if (typeof(Exception).GetTypeInfo().IsAssignableFrom(ti)) - { - return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, true); - } - else if (ti.IsAnonymous() || TryGetInterfaceEnumerableElementType(typeof(T), out elementType)) - { - return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, false); - } + Type elementType; + if (typeof(Exception).GetTypeInfo().IsAssignableFrom(ti)) + { + return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, true); + } + else if (ti.IsAnonymous() || TryGetInterfaceEnumerableElementType(typeof(T), out elementType)) + { + return DynamicObjectTypeBuilder.BuildAnonymousFormatter(typeof(T), nameMutator, excludeNull, false, false); + } - var formatterTypeInfo = DynamicObjectTypeBuilder.BuildType(assembly, typeof(T), nameMutator, excludeNull); - if (formatterTypeInfo == null) return null; + var formatterTypeInfo = DynamicObjectTypeBuilder.BuildType(assembly, typeof(T), nameMutator, excludeNull); + if (formatterTypeInfo == null) return null; - return (IJsonFormatter)Activator.CreateInstance(formatterTypeInfo.AsType()); + return (IJsonFormatter)Activator.CreateInstance(formatterTypeInfo.AsType()); + } } public static object BuildFormatterToDynamicMethod(IJsonFormatterResolver selfResolver, Func nameMutator, bool excludeNull, bool allowPrivate)