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; _maxThreads = Environment.ProcessorCount; _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(string.Format("ERROR: CreateIoCompletionPort returned {0}", 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(String.Format("ERROR: RioCreateCompletionQueue returned {0}", 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(); } }