예제 #1
0
        public void SimpleTestS()
        {            
            using(var owned = new OwnedNativeMemory(1024)) {
                var span = owned.Span;
                span[10] = 10;
                unsafe { Assert.Equal(10, owned.Pointer[10]); }

                var memory = owned.Memory;
                var array = memory.ToArray();
                Assert.Equal(owned.Length, array.Length);
                Assert.Equal(10, array[10]);

                var copy = new byte[20];
                memory.Slice(10, 20).CopyTo(copy);
                Assert.Equal(10, copy[0]);
            }

            using (OwnedPinnedArray<byte> owned = new byte[1024]) {
                var span = owned.Span;
                span[10] = 10;
                Assert.Equal(10, owned.Array[10]);

                unsafe { Assert.Equal(10, owned.Pointer[10]); }

                var memory = owned.Memory;
                var array = memory.ToArray();
                Assert.Equal(owned.Length, array.Length);
                Assert.Equal(10, array[10]);

                var copy = new byte[20];
                memory.Slice(10, 20).CopyTo(copy);
                Assert.Equal(10, copy[0]);
            }
        }
예제 #2
0
        void OnReadUnix(UVBuffer.Unix buffer, IntPtr bytesAvaliable)
        {
            long bytesRead = bytesAvaliable.ToInt64();

            if (bytesRead == 0)
            {
                return;
            }
            else if (bytesRead < 0)
            {
                var error = UVException.ErrorCodeToError((int)bytesRead);
                if (error == UVError.EOF)
                {
                    OnEndOfStream();
                    Dispose();
                }
                else
                {
                    Dispose();
                    throw new UVException((int)bytesRead);
                }
            }
            else
            {
                using (var owned = new OwnedNativeMemory((int)bytesRead, buffer.Buffer)) {
                    OnReadCompleted(owned.Memory);
                    //buffer.Dispose(); // TODO: owned memory frees the memory. this is bad; need to fix
                }
            }
        }
예제 #3
0
        public void SimpleTestS()
        {
            using (var owned = new OwnedNativeMemory(1024)) {
                var span = owned.Span;
                span[10] = 10;
                unsafe { Assert.Equal(10, owned.Pointer[10]); }

                var memory = owned.Memory;
                var array  = memory.ToArray();
                Assert.Equal(owned.Length, array.Length);
                Assert.Equal(10, array[10]);

                Span <byte> copy = new byte[20];
                memory.Slice(10, 20).CopyTo(copy);
                Assert.Equal(10, copy[0]);
            }

            using (OwnedPinnedArray <byte> owned = new byte[1024]) {
                var span = owned.Span;
                span[10] = 10;
                Assert.Equal(10, owned.Array[10]);

                unsafe { Assert.Equal(10, owned.Pointer[10]); }

                var memory = owned.Memory;
                var array  = memory.ToArray();
                Assert.Equal(owned.Length, array.Length);
                Assert.Equal(10, array[10]);

                Span <byte> copy = new byte[20];
                memory.Slice(10, 20).CopyTo(copy);
                Assert.Equal(10, copy[0]);
            }
        }
예제 #4
0
 public void NativeMemoryLifetime()
 {
     Memory<byte> copyStoredForLater;
     using (var owner = new OwnedNativeMemory(1024)) {
         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;
     });
 }
예제 #5
0
        public void NativeMemoryLifetime()
        {
            Memory <byte> copyStoredForLater;

            using (var owner = new OwnedNativeMemory(1024)) {
                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;
            });
        }
예제 #6
0
        void OnReadWindows(UVBuffer.Windows buffer, IntPtr bytesAvaliable)
        {
            // TODO: all branches need to release buffer, I think
            long bytesRead = bytesAvaliable.ToInt64();

            if (bytesRead == 0)
            {
                buffer.Dispose();
                return;
            }
            else if (bytesRead < 0)
            {
                var error = UVException.ErrorCodeToError((int)bytesRead);
                if (error == UVError.EOF)
                {
                    OnEndOfStream();
                    Dispose();
                    buffer.Dispose();
                }
                else if (error == UVError.ECONNRESET)
                {
                    Debug.Assert(buffer.Buffer == IntPtr.Zero && buffer.Length == 0);
                    // no need to dispose
                    // TODO: what should we do here?
                }
                else
                {
                    Dispose();
                    buffer.Dispose();
                    throw new UVException((int)bytesRead);
                }
            }
            else
            {
                using (var owned = new OwnedNativeMemory((int)bytesRead, buffer.Buffer)) {
                    OnReadCompleted(owned.Memory);
                    //buffer.Dispose(); // TODO: owned memory frees the memory. this is bad; need to fix
                }
            }
        }
예제 #7
0
        public void SimpleTestS()
        {
            {
                OwnedArray <byte> memory = new byte[1024];
                var span = memory.Span;
                span[10] = 10;
                Assert.Equal(10, memory.Array[10]);
            }

            using (var memory = new OwnedNativeMemory(1024)) {
                var span = memory.Span;
                span[10] = 10;
                unsafe { Assert.Equal(10, memory.Pointer[10]); }
            }

            using (OwnedPinnedArray <byte> memory = new byte[1024]) {
                var span = memory.Span;
                span[10] = 10;
                Assert.Equal(10, memory.Array[10]);

                unsafe { Assert.Equal(10, memory.Pointer[10]); }
            }
        }
예제 #8
0
        public void NativeMemoryLifetime()
        {
            Memory <byte> copyStoredForLater;
            var           owner = new OwnedNativeMemory(1024);

            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>(() => {
                        // memory is disposed
                        Span <byte> span = memorySlice.Span;
                        span[0]          = 255;
                    });
                }
                finally {
                    Assert.Throws <ObjectDisposedException>(() => {
                        // memory is disposed
                        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;
            });
        }
예제 #9
0
 void OnReadUnix(UVBuffer.Unix buffer, IntPtr bytesAvaliable)
 {
     long bytesRead = bytesAvaliable.ToInt64();
     if (bytesRead == 0)
     {
         return;
     }
     else if (bytesRead < 0)
     {
         var error = UVException.ErrorCodeToError((int)bytesRead);
         if (error == UVError.EOF)
         {
             OnEndOfStream();
             Dispose();
         }
         else
         {
             Dispose();
             throw new UVException((int)bytesRead);
         }
     }
     else
     {
         using (var owned = new OwnedNativeMemory((int)bytesRead, buffer.Buffer)) {
             OnReadCompleted(owned.Memory);
             //buffer.Dispose(); // TODO: owned memory frees the memory. this is bad; need to fix
         }
     }
 }
예제 #10
0
 void OnReadWindows(UVBuffer.Windows buffer, IntPtr bytesAvaliable)
 {
     // TODO: all branches need to release buffer, I think
     long bytesRead = bytesAvaliable.ToInt64();
     if (bytesRead == 0)
     {
         buffer.Dispose();
         return;
     }
     else if (bytesRead < 0)
     {
         var error = UVException.ErrorCodeToError((int)bytesRead);
         if (error == UVError.EOF)
         {
             OnEndOfStream();
             Dispose();
             buffer.Dispose();
         }
         else if (error == UVError.ECONNRESET)
         {
             Debug.Assert(buffer.Buffer == IntPtr.Zero && buffer.Length == 0);
             // no need to dispose
             // TODO: what should we do here?
         }
         else
         {
             Dispose();
             buffer.Dispose();
             throw new UVException((int)bytesRead);
         }
     }
     else
     {
         using (var owned = new OwnedNativeMemory((int)bytesRead, buffer.Buffer)) {
             OnReadCompleted(owned.Memory);
             //buffer.Dispose(); // TODO: owned memory frees the memory. this is bad; need to fix
         }
     }
 }
예제 #11
0
        public void NativeMemoryLifetime()
        {
            var owner = new OwnedNativeMemory(1024);

            TestLifetime(owner);
        }