コード例 #1
0
        public SendCompletionProcessor(InternalZerioConfiguration configuration, IRioCompletionQueue sendCompletionQueue)
        {
            _sendCompletionQueue      = sendCompletionQueue;
            _completionResults        = new RIO_RESULT[configuration.MaxSendCompletionResults];
            _completionResultsHandle  = GCHandle.Alloc(_completionResults, GCHandleType.Pinned);
            _completionResultsPointer = (RIO_RESULT *)_completionResultsHandle.AddrOfPinnedObject().ToPointer();

            _waitStrategy = CompletionPollingWaitStrategyFactory.Create(configuration.SendCompletionPollingWaitStrategyType);
        }
コード例 #2
0
ファイル: RioRequestQueue.cs プロジェクト: dorisoy/Zerio
        public static RioRequestQueue Create(int correlationId, IntPtr socket, IRioCompletionQueue sendingCompletionQueue, uint maxOutstandingSends, IRioCompletionQueue receivingCompletionQueue, uint maxOutstandingReceives)
        {
            var requestQueue = WinSock.Extensions.CreateRequestQueue(socket, maxOutstandingReceives, 1, maxOutstandingSends, 1, receivingCompletionQueue.QueueHandle, sendingCompletionQueue.QueueHandle, correlationId);

            if (requestQueue == IntPtr.Zero)
            {
                WinSock.ThrowLastWsaError();
            }

            return(new RioRequestQueue(requestQueue));
        }
コード例 #3
0
        public SendRequestProcessingEngine(InternalZerioConfiguration configuration, IRioCompletionQueue sendingCompletionQueue, ISessionManager sessionManager)
        {
            _configuration = configuration;

            var ringBufferSize = configuration.SendRequestProcessingEngineRingBufferSize;

            _unmanagedRioBuffer = new UnmanagedRioBuffer <SendRequestEntry>(ringBufferSize, _configuration.SendingBufferLength);

            _disruptor  = CreateDisruptor(sendingCompletionQueue, sessionManager);
            _ringBuffer = _disruptor.RingBuffer;
        }
コード例 #4
0
        private unsafe UnmanagedDisruptor <SendRequestEntry> CreateDisruptor(IRioCompletionQueue sendingCompletionQueue, ISessionManager sessionManager)
        {
            var waitStrategy = CreateWaitStrategy();

            var disruptor = new UnmanagedDisruptor <SendRequestEntry>((IntPtr)_unmanagedRioBuffer.FirstEntry,
                                                                      _unmanagedRioBuffer.EntryReservedSpaceSize,
                                                                      _unmanagedRioBuffer.Length,
                                                                      new ThreadPerTaskScheduler(),
                                                                      ProducerType.Multi,
                                                                      waitStrategy);

            var sendRequestProcessor    = new SendRequestProcessor(_configuration, sessionManager);
            var sendCompletionProcessor = new SendCompletionProcessor(_configuration, sendingCompletionQueue);

            disruptor.HandleEventsWith(sendRequestProcessor).Then(sendCompletionProcessor);

            ConfigureWaitStrategy(waitStrategy, disruptor, sendCompletionProcessor);

            return(disruptor);
        }
コード例 #5
0
 public ReceiveCompletionProcessor(InternalZerioConfiguration configuration, IRioCompletionQueue receivingCompletionQueue, ISessionManager sessionManager)
 {
     _configuration            = configuration;
     _receivingCompletionQueue = receivingCompletionQueue;
     _sessionManager           = sessionManager;
 }