private unsafe void QueueSend(IByteBuffer buffer, IPEndPoint remoteEndPoint, Action <Udp, Exception> completion) { if (buffer is null) { ThrowHelper.ThrowArgumentNullException(ExceptionArgument.buffer); } if (remoteEndPoint is null) { ThrowHelper.ThrowArgumentNullException(ExceptionArgument.remoteEndPoint); } WriteRequest request = Loop.SendRequestPool.Take(); try { request.Prepare(buffer, (sendRequest, exception) => completion?.Invoke(this, exception)); NativeMethods.UdpSend( request.InternalHandle, InternalHandle, remoteEndPoint, request.Bufs, ref request.Size); } catch (Exception exception) { request.Release(); Log.Handle_faulted(HandleType, exception); throw; } }
void FinishWrite(WriteRequest writeRequest) { try { if (writeRequest.Error != null) { ChannelOutboundBuffer input = this.OutboundBuffer; input?.FailFlushed(writeRequest.Error, true); this.Channel.Pipeline.FireExceptionCaught(writeRequest.Error); } } finally { writeRequest.Release(); } }
internal void QueueWrite(IByteBuffer bufferRef, StreamHandle sendHandle, Action <StreamHandle, Exception> completion) { Debug.Assert(bufferRef is object && sendHandle is object); WriteRequest request = Loop.WriteRequestPool.Take(); try { request.Prepare(bufferRef, (writeRequest, exception) => completion?.Invoke(_streamHandle, exception)); _streamHandle.WriteStream(request, sendHandle); } catch (Exception exception) { Log.Pipeline_Handle_faulted(_streamHandle.HandleType, exception); request.Release(); throw; } }