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);
        }
Exemple #3
0
        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);
            }
        }