/// <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; }
/// <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)); }
/// <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; }