public unsafe RioThreadPool(RegisteredIO rio, IntPtr socket, CancellationToken token) { _socket = socket; _rio = rio; _token = token; // Count non-HT cores only var procCount = CpuInfo.PhysicalCoreCount; // RSS only supports up to 16 cores _maxThreads = procCount > 16 ? 16 : procCount; _rioThreads = new RioThread[_maxThreads]; for (var i = 0; i < _rioThreads.Length; i++) { IntPtr completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, IntPtr.Zero, 0, 0); if (completionPort == IntPtr.Zero) { var error = GetLastError(); RioImports.WSACleanup(); throw new Exception($"ERROR: CreateIoCompletionPort returned {error}"); } var completionMethod = new NotificationCompletion { Type = NotificationCompletionType.IocpCompletion, Iocp = new NotificationCompletionIocp { IocpHandle = completionPort, QueueCorrelation = (ulong)i, Overlapped = (NativeOverlapped *)(-1) // nativeOverlapped } }; IntPtr completionQueue = _rio.RioCreateCompletionQueue(RioTcpServer.MaxOutsandingCompletionsPerThread, completionMethod); if (completionQueue == IntPtr.Zero) { var error = RioImports.WSAGetLastError(); RioImports.WSACleanup(); throw new Exception($"ERROR: RioCreateCompletionQueue returned {error}"); } var thread = new RioThread(i, _token, completionPort, completionQueue, rio); _rioThreads[i] = thread; } for (var i = 0; i < _rioThreads.Length; i++) { var thread = _rioThreads[i]; thread.Start(); } }
public unsafe RioThreadPool(RegisteredIO rio, IntPtr socket, CancellationToken token) { _socket = socket; _rio = rio; _token = token; // Count non-HT cores only var procCount = CpuInfo.PhysicalCoreCount; // RSS only supports up to 16 cores _maxThreads = procCount > 16 ? 16 : procCount; _rioThreads = new RioThread[_maxThreads]; for (var i = 0; i < _rioThreads.Length; i++) { IntPtr completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, IntPtr.Zero, 0, 0); if (completionPort == IntPtr.Zero) { var error = GetLastError(); RioImports.WSACleanup(); throw new Exception($"ERROR: CreateIoCompletionPort returned {error}"); } var completionMethod = new NotificationCompletion { Type = NotificationCompletionType.IocpCompletion, Iocp = new NotificationCompletionIocp { IocpHandle = completionPort, QueueCorrelation = (ulong) i, Overlapped = (NativeOverlapped*) (-1) // nativeOverlapped } }; IntPtr completionQueue = _rio.RioCreateCompletionQueue(RioTcpServer.MaxOutsandingCompletionsPerThread, completionMethod); if (completionQueue == IntPtr.Zero) { var error = RioImports.WSAGetLastError(); RioImports.WSACleanup(); throw new Exception($"ERROR: RioCreateCompletionQueue returned {error}"); } var thread = new RioThread(i, _token, completionPort, completionQueue, rio); _rioThreads[i] = thread; } for (var i = 0; i < _rioThreads.Length; i++) { var thread = _rioThreads[i]; thread.Start(); } }
internal RioTcpConnection(IntPtr socket, long connectionId, IntPtr requestQueue, RioThread rioThread, RegisteredIO rio) { _socket = socket; _connectionId = connectionId; _rio = rio; _rioThread = rioThread; _input = rioThread.PipelineFactory.Create(); _output = rioThread.PipelineFactory.Create(); _requestQueue = requestQueue; rioThread.AddConnection(connectionId, this); ProcessReceives(); _sendTask = ProcessSends(); }