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