예제 #1
0
파일: MemPool.cs 프로젝트: mengtest/MyGame
        //分配对象节点
        public QueueNode <ByteData> Aloc(int nSize)
        {
            QueueNode <ByteData> node = null;
            int nBoundSize            = GetBoundSize(nSize);

            if (nBoundSize > 0)
            {
                ThreadQueue <ByteData> queueData = null;
                if (m_dicMemPool.TryGetValue(nBoundSize, out queueData))
                {
                    node = queueData.Pop();
                    if (null != node)
                    {
                        return(node);
                    }
                }
            }
            else
            {
                nBoundSize = nSize;
            }

            node           = new QueueNode <ByteData>();
            node.item      = new ByteData();
            node.next      = null;
            node.item.data = new byte[nBoundSize];
            node.item.nLen = 0;
            return(node);
        }
예제 #2
0
        //更新(在生产者线程调用)
        public void Update()
        {
            //int nCount = 10;
            QueueNode <ByteData> node = null;

            do
            {
                node = m_oRecycleQueue.Pop();
                if (node != null)
                {
                    m_oMemPool.Recycle(ref node);
                }

                //--nCount;
            } while (node != null);//&& nCount>0);
        }
예제 #3
0
파일: kcp.cs 프로젝트: mengtest/MyGame
        private QueueNode <Segment> AlocSegmentNode(int nSize)
        {
            QueueNode <Segment> node = m_oSegmentPool.Pop();

            if (null == node)
            {
                node      = new QueueNode <Segment>();
                node.item = new Segment();
            }
            else
            {
                node.item.Clear();
            }

            //分配byte data
            node.item.data           = m_oMemPool.Aloc(nSize);
            node.item.data.item.nLen = nSize;

            return(node);
        }
예제 #4
0
 //弹出节点(在消费者中线程调用)
 public QueueNode <ByteData> Pop()
 {
     return(m_oDataQueue.Pop());
 }