public unsafe void PinnedArrayMemoryLifetime() { Memory <byte> copyStoredForLater; var bytes = new byte[1024]; fixed(byte *pBytes = bytes) { using (var owner = new OwnedPinnedArray <byte>(bytes, pBytes)) { Memory <byte> memory = owner.Memory; Memory <byte> memorySlice = memory.Slice(10); copyStoredForLater = memorySlice; using (memorySlice.Reserve()) { Assert.Throws <InvalidOperationException>(() => { // memory is reserved; cannot dispose owner.Dispose(); }); Span <byte> span = memorySlice.Span; span[0] = 255; } } } Assert.Throws <ObjectDisposedException>(() => { // manager is disposed var span = copyStoredForLater.Span; }); }
public unsafe void PinnedArrayMemoryLifetime() { var bytes = new byte[1024]; fixed(byte *pBytes = bytes) { var owner = new OwnedPinnedArray <byte>(bytes, pBytes); TestLifetime(owner); } }
static void RunLoop(bool log) { var loop = new UVLoop(); var listener = new TcpListener(s_ipAddress, s_port, loop); listener.ConnectionAccepted += (Tcp connection) => { if (log) { Console.WriteLine("connection accepted"); } connection.ReadCompleted += (data) => { if (log) { unsafe { var requestString = new Utf8String(data.Span); Console.WriteLine("*REQUEST:\n {0}", requestString.ToString()); } } var formatter = new ArrayFormatter(512, TextEncoder.Utf8); formatter.Clear(); formatter.Append("HTTP/1.1 200 OK"); formatter.Append("\r\n\r\n"); formatter.Append("Hello World!"); if (log) { formatter.Format(" @ {0:O}", DateTime.UtcNow); } var segment = formatter.Formatted; using (var memory = new OwnedPinnedArray <byte>(segment.Array)) { connection.TryWrite(memory.Memory.Slice(segment.Offset, segment.Count)); connection.Dispose(); } }; connection.ReadStart(); }; listener.Listen(); loop.Run(); }
public unsafe void PinnedArrayMemoryLifetime() { Memory <byte> copyStoredForLater; var bytes = new byte[1024]; fixed(byte *pBytes = bytes) { var owner = new OwnedPinnedArray <byte>(bytes, pBytes); try { Memory <byte> memory = owner.Memory; Memory <byte> memorySlice = memory.Slice(10); copyStoredForLater = memorySlice; var r = memorySlice.Reserve(); try { Assert.Throws <InvalidOperationException>(() => { // memory is reserved; cannot dispose owner.Dispose(); }); Assert.Throws <ObjectDisposedException>(() => { Span <byte> span = memorySlice.Span; span[0] = 255; }); } finally { Assert.Throws <ObjectDisposedException>(() => { // memory has been Disposed, so cannot free reservation r.Dispose(); }); } } finally { Assert.Throws <InvalidOperationException>(() => { // memory is still reserved as Release failed. owner.Dispose(); }); } } Assert.Throws <ObjectDisposedException>(() => { // manager is disposed var span = copyStoredForLater.Span; }); }
public unsafe void PinnedArrayMemoryLifetime() { Memory<byte> copyStoredForLater; var bytes = new byte[1024]; fixed (byte* pBytes = bytes) { using (var owner = new OwnedPinnedArray<byte>(bytes, pBytes)) { Memory<byte> memory = owner.Memory; Memory<byte> memorySlice = memory.Slice(10); copyStoredForLater = memorySlice; using (memorySlice.Reserve()) { Assert.Throws<InvalidOperationException>(() => { // memory is reserved; cannot dispose owner.Dispose(); }); Span<byte> span = memorySlice.Span; span[0] = 255; } } } Assert.Throws<ObjectDisposedException>(() => { // manager is disposed var span = copyStoredForLater.Span; }); }
static void RunLoop(bool log) { var loop = new UVLoop(); var listener = new TcpListener(s_ipAddress, s_port, loop); listener.ConnectionAccepted += (Tcp connection) => { if (log) { Console.WriteLine("connection accepted"); } connection.ReadCompleted += (data) => { if (log) { unsafe { var requestString = new Utf8String(data.Span); Console.WriteLine("*REQUEST:\n {0}", requestString.ToString()); } } var formatter = new ArrayFormatter(512, EncodingData.InvariantUtf8); formatter.Clear(); formatter.Append("HTTP/1.1 200 OK"); formatter.Append("\r\n\r\n"); formatter.Append("Hello World!"); if (log) { formatter.Format(" @ {0:O}", DateTime.UtcNow); } var segment = formatter.Formatted; using (var memory = new OwnedPinnedArray<byte>(segment.Array)) { connection.TryWrite(memory.Memory.Slice(segment.Offset, segment.Count)); connection.Dispose(); } }; connection.ReadStart(); }; listener.Listen(); loop.Run(); }