示例#1
0
        private void LargeAllocationProducesCorrectResults()
        {
            var byteRange         = Enumerable.Range(0, 16384 + 64).Select(x => (byte)x).ToArray();
            var expectedByteRange = byteRange.Concat(byteRange).ToArray();

            var mem0 = MemoryPoolBlock2.Create(new ArraySegment <byte>(byteRange), IntPtr.Zero, null, null);
            var mem1 = MemoryPoolBlock2.Create(new ArraySegment <byte>(byteRange), IntPtr.Zero, null, null);

            mem0.End = byteRange.Length;
            mem1.End = byteRange.Length;

            mem0.Next = mem1;

            var begin = mem0.GetIterator();
            var end   = GetIterator(begin, expectedByteRange.Length);

            var s = begin.GetAsciiString(end);

            Assert.Equal(s.Length, expectedByteRange.Length);

            for (var i = 0; i < expectedByteRange.Length; i++)
            {
                var sb = (byte)s[i];
                var b  = expectedByteRange[i];

                Assert.Equal(sb, b);
            }
        }
示例#2
0
        private MemoryPoolIterator2 BuildSample(string data)
        {
            var store = data.Select(c => (byte)c).ToArray();
            var mem   = MemoryPoolBlock2.Create(new ArraySegment <byte>(store), IntPtr.Zero, null, null);

            mem.End = store.Length;

            return(mem.GetIterator());
        }
示例#3
0
        private void FullByteRangeSupported()
        {
            var byteRange = Enumerable.Range(0, 256).Select(x => (byte)x).ToArray();

            var mem = MemoryPoolBlock2.Create(new ArraySegment <byte>(byteRange), IntPtr.Zero, null, null);

            mem.End = byteRange.Length;

            var begin = mem.GetIterator();
            var end   = GetIterator(begin, byteRange.Length);

            var s = begin.GetAsciiString(end);

            Assert.Equal(s.Length, byteRange.Length);

            for (var i = 0; i < byteRange.Length; i++)
            {
                var sb = (byte)s[i];
                var b  = byteRange[i];

                Assert.Equal(sb, b);
            }
        }
        public async Task SocketCanReadAndWrite()
        {
            var loop = new UvLoopHandle(_logger);

            loop.Init(_uv);
            var tcp = new UvTcpHandle(_logger);

            tcp.Init(loop);
            var address = ServerAddress.FromUrl("http://localhost:54321/");

            tcp.Bind(address);
            tcp.Listen(10, (_, status, error, state) =>
            {
                Console.WriteLine("Connected");
                var tcp2 = new UvTcpHandle(_logger);
                tcp2.Init(loop);
                tcp.Accept(tcp2);
                var data = Marshal.AllocCoTaskMem(500);
                tcp2.ReadStart(
                    (a, b, c) => tcp2.Libuv.buf_init(data, 500),
                    (__, nread, state2) =>
                {
                    if (nread <= 0)
                    {
                        tcp2.Dispose();
                    }
                    else
                    {
                        for (var x = 0; x < 2; x++)
                        {
                            var req = new UvWriteReq(new KestrelTrace(new TestKestrelTrace()));
                            req.Init(loop);
                            var block = MemoryPoolBlock2.Create(
                                new ArraySegment <byte>(new byte[] { 65, 66, 67, 68, 69 }),
                                dataPtr: IntPtr.Zero,
                                pool: null,
                                slab: null);
                            var start = new MemoryPoolIterator2(block, 0);
                            var end   = new MemoryPoolIterator2(block, block.Data.Count);
                            req.Write(
                                tcp2,
                                start,
                                end,
                                1,
                                (_1, _2, _3, _4) =>
                            {
                                block.Unpin();
                            },
                                null);
                        }
                    }
                },
                    null);
                tcp.Dispose();
            }, null);
            Console.WriteLine("Task.Run");
            var t = Task.Run(async() =>
            {
                var socket = new Socket(
                    AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);
#if DNX451
                await Task.Factory.FromAsync(
                    socket.BeginConnect,
                    socket.EndConnect,
                    new IPEndPoint(IPAddress.Loopback, 54321),
                    null,
                    TaskCreationOptions.None);
                await Task.Factory.FromAsync(
                    socket.BeginSend,
                    socket.EndSend,
                    new[] { new ArraySegment <byte>(new byte[] { 1, 2, 3, 4, 5 }) },
                    SocketFlags.None,
                    null,
                    TaskCreationOptions.None);
#else
                await socket.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 54321));
                await socket.SendAsync(new[] { new ArraySegment <byte>(new byte[] { 1, 2, 3, 4, 5 }) },
                                       SocketFlags.None);
#endif
                socket.Shutdown(SocketShutdown.Send);
                var buffer = new ArraySegment <byte>(new byte[2048]);
                while (true)
                {
#if DNX451
                    var count = await Task.Factory.FromAsync(
                        socket.BeginReceive,
                        socket.EndReceive,
                        new[] { buffer },
                        SocketFlags.None,
                        null,
                        TaskCreationOptions.None);
#else
                    var count = await socket.ReceiveAsync(new[] { buffer }, SocketFlags.None);
#endif
                    Console.WriteLine("count {0} {1}",
                                      count,
                                      System.Text.Encoding.ASCII.GetString(buffer.Array, 0, count));
                    if (count <= 0)
                    {
                        break;
                    }
                }
                socket.Dispose();
            });

            loop.Run();
            loop.Dispose();
            await t;
        }
示例#5
0
        public void ServerPipeListenForConnections()
        {
            var loop             = new UvLoopHandle(_logger);
            var serverListenPipe = new UvPipeHandle(_logger);

            loop.Init(_uv);
            serverListenPipe.Init(loop, false);
            serverListenPipe.Bind(@"\\.\pipe\ServerPipeListenForConnections");
            serverListenPipe.Listen(128, (_1, status, error, _2) =>
            {
                var serverConnectionPipe = new UvPipeHandle(_logger);
                serverConnectionPipe.Init(loop, true);
                try
                {
                    serverListenPipe.Accept(serverConnectionPipe);
                }
                catch (Exception)
                {
                    serverConnectionPipe.Dispose();
                    return;
                }

                var writeRequest = new UvWriteReq(new KestrelTrace(new TestKestrelTrace()));
                writeRequest.Init(loop);
                var block = MemoryPoolBlock2.Create(
                    new ArraySegment <byte>(new byte[] { 1, 2, 3, 4 }),
                    dataPtr: IntPtr.Zero,
                    pool: null,
                    slab: null);
                var start = new MemoryPoolIterator2(block, 0);
                var end   = new MemoryPoolIterator2(block, block.Data.Count);
                writeRequest.Write(
                    serverConnectionPipe,
                    start,
                    end,
                    1,
                    (_3, status2, error2, _4) =>
                {
                    writeRequest.Dispose();
                    serverConnectionPipe.Dispose();
                    serverListenPipe.Dispose();
                    block.Unpin();
                },
                    null);
            }, null);

            var worker = new Thread(() =>
            {
                var loop2 = new UvLoopHandle(_logger);
                var clientConnectionPipe = new UvPipeHandle(_logger);
                var connect = new UvConnectRequest(new KestrelTrace(new TestKestrelTrace()));

                loop2.Init(_uv);
                clientConnectionPipe.Init(loop2, true);
                connect.Init(loop2);
                connect.Connect(clientConnectionPipe, @"\\.\pipe\ServerPipeListenForConnections", (_1, status, error, _2) =>
                {
                    var buf = loop2.Libuv.buf_init(Marshal.AllocHGlobal(8192), 8192);

                    connect.Dispose();
                    clientConnectionPipe.ReadStart(
                        (_3, cb, _4) => buf,
                        (_3, status2, _4) =>
                    {
                        if (status2 == 0)
                        {
                            clientConnectionPipe.Dispose();
                        }
                    },
                        null);
                }, null);
                loop2.Run();
                loop2.Dispose();
            });

            worker.Start();
            loop.Run();
            loop.Dispose();
            worker.Join();
        }