private async void DoWrite(ReadableBuffer buffer) { var writeReq = _thread.WriteReqPool.Allocate(); try { _pendingWrites++; // Preserve this buffer for disposal after the write completes using (buffer.Preserve()) { await writeReq.Write(_handle, ref buffer); } } finally { _pendingWrites--; _thread.WriteReqPool.Return(writeReq); if (_drainWrites != null) { if (_pendingWrites == 0) { _drainWrites.TrySetResult(null); } } } }
public void SetHeader(ref ReadableBuffer key, ref ReadableBuffer value) { _headers[key.GetAsciiString()] = new HeaderValue { Raw = value.Preserve() }; }
public void SetHeader(ref ReadableBuffer key, ref ReadableBuffer value) { string headerKey = GetHeaderKey(ref key); _headers[headerKey] = new HeaderValue { Raw = value.Preserve() }; }
public unsafe void Write( UvStreamHandle handle, ReadableBuffer buffer, Action <UvWriteReq, int, object> callback, object state) { try { // Preserve the buffer for the async call _buffer = buffer.Preserve(); buffer = _buffer.Buffer; int nBuffers = 0; if (buffer.IsSingleSpan) { nBuffers = 1; } else { foreach (var span in buffer) { nBuffers++; } } // add GCHandle to keeps this SafeHandle alive while request processing _pins.Add(GCHandle.Alloc(this, GCHandleType.Normal)); var pBuffers = (Uv.uv_buf_t *)_bufs; if (nBuffers > BUFFER_COUNT) { // create and pin buffer array when it's larger than the pre-allocated one var bufArray = new Uv.uv_buf_t[nBuffers]; var gcHandle = GCHandle.Alloc(bufArray, GCHandleType.Pinned); _pins.Add(gcHandle); pBuffers = (Uv.uv_buf_t *)gcHandle.AddrOfPinnedObject(); } if (nBuffers == 1) { var memory = buffer.First; void *pointer; if (memory.TryGetPointer(out pointer)) { pBuffers[0] = Libuv.buf_init((IntPtr)pointer, memory.Length); } else { throw new InvalidOperationException("Memory needs to be pinned"); } } else { int i = 0; void *pointer; foreach (var memory in buffer) { if (memory.TryGetPointer(out pointer)) { pBuffers[i++] = Libuv.buf_init((IntPtr)pointer, memory.Length); } else { throw new InvalidOperationException("Memory needs to be pinned"); } } } _callback = callback; _state = state; _uv.write(this, handle, pBuffers, nBuffers, _uv_write_cb); } catch { _callback = null; _state = null; _buffer.Dispose(); Unpin(this); throw; } }
public unsafe void Write( UvStreamHandle handle, ReadableBuffer buffer, Action<UvWriteReq, int, object> callback, object state) { try { // Preserve the buffer for the async call _buffer = buffer.Preserve(); buffer = _buffer.Buffer; int nBuffers = 0; if (buffer.IsSingleSpan) { nBuffers = 1; } else { foreach (var span in buffer) { nBuffers++; } } // add GCHandle to keeps this SafeHandle alive while request processing _pins.Add(GCHandle.Alloc(this, GCHandleType.Normal)); var pBuffers = (Uv.uv_buf_t*)_bufs; if (nBuffers > BUFFER_COUNT) { // create and pin buffer array when it's larger than the pre-allocated one var bufArray = new Uv.uv_buf_t[nBuffers]; var gcHandle = GCHandle.Alloc(bufArray, GCHandleType.Pinned); _pins.Add(gcHandle); pBuffers = (Uv.uv_buf_t*)gcHandle.AddrOfPinnedObject(); } if (nBuffers == 1) { var memory = buffer.First; void* pointer; if (memory.TryGetPointer(out pointer)) { pBuffers[0] = Libuv.buf_init((IntPtr)pointer, memory.Length); } else { throw new InvalidOperationException("Memory needs to be pinned"); } } else { int i = 0; void* pointer; foreach (var memory in buffer) { if (memory.TryGetPointer(out pointer)) { pBuffers[i++] = Libuv.buf_init((IntPtr)pointer, memory.Length); } else { throw new InvalidOperationException("Memory needs to be pinned"); } } } _callback = callback; _state = state; _uv.write(this, handle, pBuffers, nBuffers, _uv_write_cb); } catch { _callback = null; _state = null; _buffer.Dispose(); Unpin(this); throw; } }