internal static void PushNotNull(MemberMapValueJsonSerializeConfig value) { if (count >= maxCount) { return; } System.Threading.Interlocked.Increment(ref count); MemberMapValueJsonSerializeConfig headValue; do { if ((headValue = head) == null) { value.LinkNext = null; if (System.Threading.Interlocked.CompareExchange(ref head, value, null) == null) { return; } } else { value.LinkNext = headValue; if (System.Threading.Interlocked.CompareExchange(ref head, value, headValue) == headValue) { return; } } AutoCSer.Threading.ThreadYield.Yield(); }while (true); }
private static void pushLink(MemberMapValueJsonSerializeConfig value, MemberMapValueJsonSerializeConfig end, int pushCount) { System.Threading.Interlocked.Add(ref count, pushCount); MemberMapValueJsonSerializeConfig headValue; do { if ((headValue = head) == null) { end.LinkNext = null; if (System.Threading.Interlocked.CompareExchange(ref head, value, null) == null) { return; } } else { end.LinkNext = headValue; if (System.Threading.Interlocked.CompareExchange(ref head, value, headValue) == headValue) { return; } } AutoCSer.Threading.ThreadYield.Yield(); }while (true); }
internal void ToJson(AutoCSer.JsonSerializer serializer) { MemberMap memberMap = MemberMap; if (memberMap == null || memberMap.IsDefault) { serializer.TypeSerialize(Value); } else { MemberMapValueJsonSerializeConfig config = MemberMapValueJsonSerializeConfig.Pop() ?? new MemberMapValueJsonSerializeConfig(); AutoCSer.Json.SerializeConfig oldConfig = serializer.Config; AutoCSer.MemberCopy.Copyer <AutoCSer.Json.SerializeConfig> .Copy(config, oldConfig); (serializer.Config = config).MemberMap = memberMap; try { serializer.TypeSerialize(Value); } finally { serializer.Config = oldConfig; config.MemberMap = null; MemberMapValueJsonSerializeConfig.PushNotNull(config); } } }
/// <summary> /// 清除缓存数据 /// </summary> /// <param name="saveCount">保留缓存数据数量</param> private static void clearCache(int saveCount) { MemberMapValueJsonSerializeConfig headValue = System.Threading.Interlocked.Exchange(ref head, null); count = 0; if (headValue != null && saveCount != 0) { int pushCount = saveCount; MemberMapValueJsonSerializeConfig end = headValue; while (--saveCount != 0) { if (end.LinkNext == null) { pushLink(headValue, end, pushCount - saveCount); return; } end = end.LinkNext; } end.LinkNext = null; pushLink(headValue, end, pushCount); } }