コード例 #1
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;
            }
コード例 #2
0
            /// <summary>
            /// Allocates a new frame of specified size.
            /// </summary>
            /// <param name="frameSize"></param>
            /// <returns></returns>
            public Frame GetFrame(int reqFrameSize)
            {
                int frameSize = GetNormalizedSize(reqFrameSize);

                if (frameSize == -1) // too large for frame pool
                {
                    return(new Frame(reqFrameSize));
                }

                // try to get frame from pool
                lock (_lock)
                {
                    int idx = GetPoolIndex(frameSize, false);
                    if (idx != -1)
                    {
                        Queue queue = _framePool[idx] as Queue;
                        if (queue == null)
                        {
                            throw new System.ApplicationException();
                        }
                        Frame frame = queue.GetFrame();
                        if (frame != null)
                        {
                            frame.SanityCheck(true);

                            if ((frame.lenOffset != 0) || (frame.lenData != 0))
                            {
                                throw new ApplicationException("frame was not properly initialized.");
                            }

                            frame.released = false;
                            return(frame);
                        }
                    }
                }

                // create a new frame
                return(new Frame(frameSize));
            }
コード例 #3
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;
            }