コード例 #1
0
ファイル: RioRequestQueue.cs プロジェクト: dorisoy/Zerio
        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();
                }
            }
        }
コード例 #2
0
 public RioBuffer(int id, byte *dataPointer, RIO_BUF *bufferDescriptor, int length)
 {
     Id               = id;
     Data             = dataPointer;
     BufferDescriptor = bufferDescriptor;
     Length           = length;
 }
コード例 #3
0
        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();
            }
        }
コード例 #4
0
        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;
        }
コード例 #5
0
        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);
        }