Example #1
0
        /// <summary>
        /// 添加计算任务
        /// </summary>
        /// <param name="value"></param>
        private void append(ref ClientCustomSerialize value)
        {
            int length = value.Buffer.Count;
            ServerCustomSerializeBuffer buffer = null;

            while (System.Threading.Interlocked.CompareExchange(ref bufferLock, 1, 0) != 0)
            {
                AutoCSer.Threading.ThreadYield.Yield();
            }
            if (currentBuffer != null)
            {
                if (currentBuffer.Size + length <= ServerCustomSerializeBuffer.BufferSize)
                {
                    buffer = currentBuffer;
                }
                else
                {
                    if (endBuffer == null)
                    {
                        headBuffer = currentBuffer;
                    }
                    else
                    {
                        endBuffer.LinkNext = currentBuffer;
                    }
                    endBuffer = currentBuffer;
                }
                currentBuffer = null;
            }
            System.Threading.Interlocked.Exchange(ref bufferLock, 0);
            if (buffer == null)
            {
                while (System.Threading.Interlocked.CompareExchange(ref freeBufferLock, 1, 0) != 0)
                {
                    AutoCSer.Threading.ThreadYield.Yield();
                }
                if (freeBuffer == null)
                {
                    System.Threading.Interlocked.Exchange(ref freeBufferLock, 0);
                    buffer = new ServerCustomSerializeBuffer();
                }
                else
                {
                    buffer     = freeBuffer;
                    freeBuffer = freeBuffer.LinkNext;
                    System.Threading.Interlocked.Exchange(ref freeBufferLock, 0);
                    buffer.LinkNext = null;
                }
            }
            buffer.Copy(ref value.Buffer);
            while (System.Threading.Interlocked.CompareExchange(ref bufferLock, 1, 0) != 0)
            {
                AutoCSer.Threading.ThreadYield.Yield();
            }
            currentBuffer = buffer;
            System.Threading.Interlocked.Exchange(ref bufferLock, 0);
        }
Example #2
0
        /// <summary>
        /// 添加计算任务
        /// </summary>
        /// <param name="value"></param>
        private void append(ref ClientCustomSerialize value)
        {
            int length = value.Buffer.Count;
            ServerCustomSerializeBuffer buffer = null;

            AutoCSer.Threading.Interlocked.CompareExchangeYield(ref bufferLock);
            if (currentBuffer != null)
            {
                if (currentBuffer.Size + length <= ServerCustomSerializeBuffer.BufferSize)
                {
                    buffer = currentBuffer;
                }
                else
                {
                    if (endBuffer == null)
                    {
                        headBuffer = currentBuffer;
                    }
                    else
                    {
                        endBuffer.LinkNext = currentBuffer;
                    }
                    endBuffer = currentBuffer;
                }
                currentBuffer = null;
            }
            bufferLock = 0;
            if (buffer == null)
            {
                AutoCSer.Threading.Interlocked.CompareExchangeYield(ref freeBufferLock);
                if (freeBuffer == null)
                {
                    freeBufferLock = 0;
                    buffer         = new ServerCustomSerializeBuffer();
                }
                else
                {
                    buffer          = freeBuffer;
                    freeBuffer      = freeBuffer.LinkNext;
                    freeBufferLock  = 0;
                    buffer.LinkNext = null;
                }
            }
            buffer.Copy(ref value.Buffer);
            AutoCSer.Threading.Interlocked.CompareExchangeYield(ref bufferLock);
            currentBuffer = buffer;
            bufferLock    = 0;
        }
        /// <summary>
        /// 序列化操作
        /// </summary>
        /// <param name="serializer"></param>
        internal void Serialize(AutoCSer.BinarySerialize.Serializer serializer)
        {
            UnmanagedStream             stream = serializer.Stream;
            byte *                      start = stream.CurrentData, write = start + sizeof(int);
            int                         freeCount = (stream.FreeSize - sizeof(int) * 2) / (sizeof(int) * 3), outputCount = 0;
            ServerCustomSerializeBuffer buffer;

            do
            {
                AutoCSer.Threading.Interlocked.CompareExchangeYield(ref bufferLock);
                if (headBuffer == null)
                {
                    buffer        = currentBuffer;
                    currentBuffer = null;
                    System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                    if (buffer == null)
                    {
                        Interlocked.Exchange(ref isOutput, 0);
                        if ((headBuffer == null && currentBuffer == null) || Interlocked.CompareExchange(ref isOutput, 1, 0) != 0)
                        {
                            stream.MoveSize(*(int *)start = (outputCount * (sizeof(int) * 3)) + sizeof(int));
                            return;
                        }
                        continue;
                    }
                }
                else
                {
                    buffer = headBuffer;
                    if ((headBuffer = headBuffer.LinkNext) == null)
                    {
                        headBuffer = endBuffer = null;
                        System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                    }
                    else
                    {
                        System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                        buffer.LinkNext = null;
                    }
                }
                int bufferCount = buffer.Size / (sizeof(int) * 2);
                if (bufferCount > freeCount)
                {
                    onCustomSerialize.Callback(new ServerCustomSerialize {
                        Output = this
                    });
                    write = buffer.Serialize(write, freeCount);
                    AutoCSer.Threading.Interlocked.CompareExchangeYield(ref bufferLock);
                    if (headBuffer == null)
                    {
                        endBuffer = buffer;
                    }
                    else
                    {
                        buffer.LinkNext = headBuffer;
                    }
                    headBuffer = buffer;
                    System.Threading.Interlocked.Exchange(ref bufferLock, 0);
                    stream.MoveSize(*(int *)start = ((outputCount + freeCount) * (sizeof(int) * 3)) + sizeof(int));
                    return;
                }
                write = buffer.Serialize(write);
                AutoCSer.Threading.Interlocked.CompareExchangeYield(ref freeBufferLock);
                buffer.LinkNext = freeBuffer;
                freeBuffer      = buffer;
                System.Threading.Interlocked.Exchange(ref freeBufferLock, 0);
                outputCount += bufferCount;
                if ((freeCount -= bufferCount) == 0)
                {
                    stream.MoveSize(*(int *)start = (outputCount * (sizeof(int) * 3)) + sizeof(int));
                    if (headBuffer == null && currentBuffer == null)
                    {
                        Interlocked.Exchange(ref isOutput, 0);
                        if ((headBuffer == null && currentBuffer == null) || Interlocked.CompareExchange(ref isOutput, 1, 0) != 0)
                        {
                            return;
                        }
                    }
                    onCustomSerialize.Callback(new ServerCustomSerialize {
                        Output = this
                    });
                    return;
                }
            }while (true);
        }