public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var inputBuffer = await input.ReadAsync(); if (inputBuffer.IsEmpty && input.Completion.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var span = inputBuffer.FirstSpan; if (span.Length > 0) { _inflater.SetInput(span.BufferPtr, span.Length); int written = _inflater.Inflate(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length); writerBuffer.CommitBytes(written); var consumed = span.Length - _inflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); } inputBuffer.Consumed(); await writerBuffer.FlushAsync(); } input.CompleteReading(); output.CompleteWriting(); _inflater.Dispose(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var inputBuffer = await input; if (inputBuffer.IsEmpty && input.Completion.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var span = inputBuffer.FirstSpan; _deflater.SetInput(span.BufferPtr, span.Length); while (!_deflater.NeedsInput()) { int written = _deflater.ReadDeflateOutput(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length); writerBuffer.CommitBytes(written); } var consumed = span.Length - _deflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); inputBuffer.Consumed(); await writerBuffer.FlushAsync(); } bool flushed; do { // Need to do more stuff here var writerBuffer = output.Alloc(2048); int compressedBytes; flushed = _deflater.Flush(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length, out compressedBytes); writerBuffer.CommitBytes(compressedBytes); await writerBuffer.FlushAsync(); }while (flushed); bool finished; do { // Need to do more stuff here var writerBuffer = output.Alloc(2048); int compressedBytes; finished = _deflater.Finish(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length, out compressedBytes); writerBuffer.CommitBytes(compressedBytes); await writerBuffer.FlushAsync(); }while (!finished); input.CompleteReading(); output.CompleteWriting(); _deflater.Dispose(); }
public static WriteableBufferFormatter GetFormatter(this IWritableChannel channel, FormattingData formattingData) { var buffer = channel.Alloc(2048); return(new WriteableBufferFormatter(ref buffer, formattingData)); }
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(); }