private async void Consume(IReadableChannel channel) { while (true) { var result = await channel.ReadAsync(); var buffer = result.Buffer; try { if (buffer.IsEmpty && result.IsCompleted) { break; } await WriteAsync(buffer); } finally { channel.Advance(buffer.End); } } channel.Complete(); }
public void Dispose() { State = WebSocketConnectionState.Closed; _pinger?.Dispose(); _timerCts.Cancel(); _terminateReceiveCts.Cancel(); _inbound.Complete(); _outbound.Complete(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var inputBuffer = await input.ReadAsync(); if (inputBuffer.IsEmpty && input.Reading.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var memory = inputBuffer.First; if (memory.Length > 0) { unsafe { _inflater.SetInput((IntPtr)memory.UnsafePointer, memory.Length); int written = _inflater.Inflate((IntPtr)memory.UnsafePointer, memory.Length); writerBuffer.Advance(written); var consumed = memory.Length - _inflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); } } input.Advance(inputBuffer.End); await writerBuffer.FlushAsync(); } input.Complete(); output.Complete(); _inflater.Dispose(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var result = await input.ReadAsync(); var inputBuffer = result.Buffer; if (inputBuffer.IsEmpty) { if (result.IsCompleted) { break; } input.Advance(inputBuffer.End); continue; } var writerBuffer = output.Alloc(); var memory = inputBuffer.First; unsafe { // TODO: Pin pointer if not pinned void *inPointer; if (memory.TryGetPointer(out inPointer)) { _deflater.SetInput((IntPtr)inPointer, memory.Length); } else { throw new InvalidOperationException("Pointer needs to be pinned"); } } while (!_deflater.NeedsInput()) { unsafe { void *outPointer; writerBuffer.Ensure(); if (writerBuffer.Memory.TryGetPointer(out outPointer)) { int written = _deflater.ReadDeflateOutput((IntPtr)outPointer, writerBuffer.Memory.Length); writerBuffer.Advance(written); } else { throw new InvalidOperationException("Pointer needs to be pinned"); } } } var consumed = memory.Length - _deflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); input.Advance(inputBuffer.End); await writerBuffer.FlushAsync(); } bool flushed = false; do { // Need to do more stuff here var writerBuffer = output.Alloc(); unsafe { void *pointer; writerBuffer.Ensure(); var memory = writerBuffer.Memory; if (memory.TryGetPointer(out pointer)) { int compressedBytes; flushed = _deflater.Flush((IntPtr)pointer, memory.Length, out compressedBytes); writerBuffer.Advance(compressedBytes); } else { throw new InvalidOperationException("Pointer needs to be pinned"); } } await writerBuffer.FlushAsync(); }while (flushed); bool finished = false; do { // Need to do more stuff here var writerBuffer = output.Alloc(); unsafe { void *pointer; writerBuffer.Ensure(); var memory = writerBuffer.Memory; if (memory.TryGetPointer(out pointer)) { int compressedBytes; finished = _deflater.Finish((IntPtr)pointer, memory.Length, out compressedBytes); writerBuffer.Advance(compressedBytes); } } await writerBuffer.FlushAsync(); }while (!finished); input.Complete(); output.Complete(); _deflater.Dispose(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var result = await input.ReadAsync(); var inputBuffer = result.Buffer; if (inputBuffer.IsEmpty) { if (result.IsCompleted) { break; } input.Advance(inputBuffer.End); continue; } var writerBuffer = output.Alloc(); var memory = inputBuffer.First; if (memory.Length > 0) { unsafe { void *pointer; if (memory.TryGetPointer(out pointer)) { _inflater.SetInput((IntPtr)pointer, memory.Length); void *writePointer; writerBuffer.Ensure(); if (writerBuffer.Memory.TryGetPointer(out writePointer)) { int written = _inflater.Inflate((IntPtr)writePointer, writerBuffer.Memory.Length); writerBuffer.Advance(written); } else { throw new InvalidOperationException("Pointer needs to be pinned"); } } else { throw new InvalidOperationException("Pointer needs to be pinned"); } var consumed = memory.Length - _inflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); } } input.Advance(inputBuffer.End); await writerBuffer.FlushAsync(); } input.Complete(); output.Complete(); _inflater.Dispose(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var inputBuffer = await input.ReadAsync(); if (inputBuffer.IsEmpty && input.Reading.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var memory = inputBuffer.First; unsafe { _deflater.SetInput((IntPtr)memory.UnsafePointer, memory.Length); } while (!_deflater.NeedsInput()) { unsafe { int written = _deflater.ReadDeflateOutput((IntPtr)writerBuffer.Memory.UnsafePointer, writerBuffer.Memory.Length); writerBuffer.Advance(written); } } var consumed = memory.Length - _deflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); input.Advance(inputBuffer.End); await writerBuffer.FlushAsync(); } bool flushed; do { // Need to do more stuff here var writerBuffer = output.Alloc(2048); var memory = writerBuffer.Memory; unsafe { int compressedBytes; flushed = _deflater.Flush((IntPtr)memory.UnsafePointer, memory.Length, out compressedBytes); writerBuffer.Advance(compressedBytes); } await writerBuffer.FlushAsync(); }while (flushed); bool finished; do { // Need to do more stuff here var writerBuffer = output.Alloc(2048); var memory = writerBuffer.Memory; unsafe { int compressedBytes; finished = _deflater.Finish((IntPtr)memory.UnsafePointer, memory.Length, out compressedBytes); writerBuffer.Advance(compressedBytes); } await writerBuffer.FlushAsync(); }while (!finished); input.Complete(); output.Complete(); _deflater.Dispose(); }