public unsafe void TryWrite(Memory <byte> data) { // This can work with Span<byte> because it's synchronous but we need pinning support EnsureNotDisposed(); void *pointer; if (!data.TryGetPointer(out pointer)) { throw new InvalidOperationException("Pointer not available"); } IntPtr ptrData = (IntPtr)pointer; var length = data.Length; if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } }
public unsafe void TryWrite(byte[] data, int length) { Debug.Assert(data != null); if (data.Length < length) { throw new ArgumentOutOfRangeException("length"); } EnsureNotDisposed(); fixed(byte *pData = data) { IntPtr ptrData = (IntPtr)pData; if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } } }
public unsafe void TryWrite(byte[] data, int length) { Debug.Assert(data != null); if(data.Length < length) { throw new ArgumentOutOfRangeException("length"); } EnsureNotDisposed(); fixed (byte* pData = data) { IntPtr ptrData = (IntPtr)pData; if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } } }
public unsafe void TryWrite(Span <byte> data) { EnsureNotDisposed(); ArraySegment <byte> array; void * pointer; IntPtr ptrData; if (data.TryGetArrayElseGetPointer(out array, out pointer)) { throw new NotImplementedException("needs to pin the array"); } else { ptrData = (IntPtr)pointer; } if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)data.Length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)data.Length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } }
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 { Dispose(); buffer.Dispose(); throw new UVException((int)bytesRead); } } else { var readSlice = new ByteSpan((byte *)buffer.Buffer, (int)bytesRead); OnReadCompleted(readSlice); buffer.Dispose(); } }
public unsafe void TryWrite(Span <byte> data) { EnsureNotDisposed(); IntPtr ptrData = (IntPtr)data.UnsafePointer; if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)data.Length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)data.Length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } }
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 OwnedNativeBuffer((int)bytesRead, buffer.Buffer)) { OnReadCompleted(owned.Memory); //buffer.Dispose(); // TODO: owned memory frees the memory. this is bad; need to fix } } }
public unsafe void TryWrite(ReadOnlySpan <byte> data) { // This can work with Span<byte> because it's synchronous but we need pinning support EnsureNotDisposed(); fixed(byte *source = &MemoryMarshal.GetReference(data)) { var length = data.Length; if (IsUnix) { var buffer = new UVBuffer.Unix((IntPtr)source, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows((IntPtr)source, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } } }
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 { var readSlice = new Span <byte>((byte *)buffer.Buffer, (int)bytesRead); OnReadCompleted(readSlice); buffer.Dispose(); } }
static void OnReadWindows(IntPtr streamPointer, IntPtr size, ref UVBuffer.Windows buffer) { var stream = As <UVStream>(streamPointer); stream.OnReadWindows(buffer, size); }
public unsafe void TryWrite(ByteSpan data) { EnsureNotDisposed(); IntPtr ptrData = (IntPtr)data.UnsafeBuffer; if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)data.Length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)data.Length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } }
public unsafe void TryWrite(Memory<byte> data) { // This can work with Span<byte> because it's synchronous but we need pinning support EnsureNotDisposed(); void* pointer; if (!data.TryGetPointer(out pointer)) { throw new InvalidOperationException("Pointer not available"); } IntPtr ptrData = (IntPtr)pointer; var length = data.Length; if (IsUnix) { var buffer = new UVBuffer.Unix(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } else { var buffer = new UVBuffer.Windows(ptrData, (uint)length); UVException.ThrowIfError(UVInterop.uv_try_write(Handle, &buffer, 1)); } }