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