unsafe public void Wirte <T>(T src, Int32 size) { ThreadLocalBuffer localBuffer = innerBuffer.Value; if (localBuffer.Capacity < size) { localBuffer.Resize(size); } //IntPtr ptr = Marshal.AllocHGlobal(size); IntPtr ptr = localBuffer.Buffer; Marshal.StructureToPtr(src, ptr, false); Marshal.Copy(ptr, buffer, writeHead, size); // ptr to buffer writeHead += size; if (writeHead > buffer.Length) { throw new Exception(); } // using inner buffer //Marshal.FreeHGlobal(ptr); return; }
unsafe public bool Peek <T>(T dest, Int32 size) { if ((readHead + size) <= writeHead) { throw new Exception(); return(false); } ThreadLocalBuffer localBuffer = innerBuffer.Value; IntPtr ptr = localBuffer.Buffer; //IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(buffer, readHead, ptr, size); dest = (T)Marshal.PtrToStructure(ptr, typeof(T)); //readHead += size; return(true); //Marshal.FreeHGlobal(ptr); }