public unsafe void Send(long sequence, RIO_BUF *bufferSegmentDescriptor, bool flush) { var lockTaken = false; var spinlock = new SpinLock(); try { spinlock.Enter(ref lockTaken); var rioSendFlags = flush ? RIO_SEND_FLAGS.NONE : RIO_SEND_FLAGS.DEFER; rioSendFlags |= RIO_SEND_FLAGS.DONT_NOTIFY; if (!WinSock.Extensions.Send(_handle, bufferSegmentDescriptor, 1, rioSendFlags, sequence)) { WinSock.ThrowLastWsaError(); } } finally { if (lockTaken) { spinlock.Exit(); } } }
public RioBuffer(int id, byte *dataPointer, RIO_BUF *bufferDescriptor, int length) { Id = id; Data = dataPointer; BufferDescriptor = bufferDescriptor; Length = length; }
public unsafe void Send(long sequence, RIO_BUF *bufferSegmentDescriptor, bool flush) { var rioSendFlags = flush ? RIO_SEND_FLAGS.NONE : RIO_SEND_FLAGS.DEFER; if (!WinSock.Extensions.Send(_handle, bufferSegmentDescriptor, 1, rioSendFlags, sequence)) { WinSock.ThrowLastWsaError(); } }
internal RioBufferSegment(RioFixedBufferPool pool, IntPtr bufferStartPointer, IntPtr segmentStartPointer, int index, int Length) { Index = index; TotalLength = Length; _pool = pool; var offset = index * Length; dataPointer = (byte *)(bufferStartPointer + offset).ToPointer(); SegmentPointer = (RIO_BUF *)(segmentStartPointer + index * Marshal.SizeOf <RIO_BUF>()).ToPointer(); SegmentPointer->BufferId = IntPtr.Zero; SegmentPointer->Offset = offset; SegmentPointer->Length = 0; _continuationWrapperDelegate = o => ((Action)o)(); _awaitableState = _notStarted; }
private static List <RioBuffer> CreateBuffers(byte *buffer, RIO_BUF *segmentBuffer, int maxLength, int segmentLength = 10) { var segments = new List <RioBuffer>(); var pBuffer = buffer; var readDataLength = 0; var segmentId = 0; while (readDataLength != maxLength) { var dataLength = Math.Min(segmentLength, maxLength - readDataLength); segmentBuffer->Length = dataLength; var segment = new RioBuffer(segmentId++, pBuffer, segmentBuffer, segmentLength) { DataLength = dataLength }; segments.Add(segment); readDataLength += dataLength; pBuffer += segmentLength; segmentBuffer++; } return(segments); }