コード例 #1
0
        /// <summary>
        /// Get a frame from the memory pool
        /// </summary>
        /// <param name="headerSize">the required header size</param>
        /// <param name="dataSize">the required data size</param>
        /// <returns></returns>
        public static Frame GetFrame(int headerSize, int dataSize)
        {
            Frame frame = instance.GetFrame(headerSize + dataSize);

            frame.ReserveHeader(headerSize);
            return(frame);
        }
コード例 #2
0
            /// <summary>
            /// Release a frame, moving it into memory pool
            /// </summary>
            /// <param name="frame">The frame to release, will be set to null</param>
            public void Release(ref Frame frame)
            {
                if (frame == null)
                {
                    return;
                }
                int frameSize = GetNormalizedSize(frame.LengthBuffer);

                if (frameSize == -1 || frameSize != frame.LengthBuffer)
                {
                    return; // if frame is too large for pool or length is non-standard, dispose
                }
                lock (_lock)
                {
                    int   idx   = GetPoolIndex(frameSize, true);
                    Queue queue = _framePool[idx] as Queue;
                    if (queue == null)
                    {
                        throw new System.ApplicationException();
                    }
                    frame.ReserveHeader(0); // clear frame
                    frame.SanityCheck(false);
                    frame.released = true;
                    bool ignore = queue.AddFrame(ref frame);
                }

                frame = null;
            }
コード例 #3
0
 /// <summary>
 /// Encode command frame
 /// </summary>
 /// <param name="frame">target buffer</param>
 /// <returns>True on success</returns>
 public bool WriteToFrame(Frame frame)
 {
     if (frame == null || frame.LengthDataAvail < _lengthMax || frame.LengthDataUsed != 0)
         return false;
     frame.ReserveHeader(frame.LengthHeaderAvail + 1); // increase header space by one byte
     frame.AllocBack(_lengthMax - 1); // reserve space without command type, so payload is at 0..n-1
     EncodePayload(frame);
     frame.AllocFront(1);
     frame.Write(0, (byte)_type);
     return true;
 }
コード例 #4
0
ファイル: Frame.cs プロジェクト: aura1213/netmf-interpreter
            /// <summary>
            /// Release a frame, moving it into memory pool
            /// </summary>
            /// <param name="frame">The frame to release, will be set to null</param>
            public void Release(ref Frame frame)
            {
                if (frame == null)
                    return;
                int frameSize = GetNormalizedSize(frame.LengthBuffer);
                if (frameSize == -1 || frameSize != frame.LengthBuffer)
                    return; // if frame is too large for pool or length is non-standard, dispose

                lock (_lock)
                {
                    int idx = GetPoolIndex(frameSize, true);
                    Queue queue = _framePool[idx] as Queue;
                    if (queue == null)
                        throw new System.ApplicationException();
                    frame.ReserveHeader(0); // clear frame
                    frame.SanityCheck(false);
                    frame.released = true;
                    bool ignore = queue.AddFrame(ref frame);
                }

                frame = null;
            }