public Task BindAsync() { lock (_gate) { if (_state != State.Initial) { throw new InvalidOperationException($"Invalid operation: {_state}"); } _stoppedTcs = new TaskCompletionSource <object>(); try { _pipeEnds = PipeEnd.CreatePair(blocking: false); _thread = new Thread(AcceptThreadStart);; _thread.Start(); _state = State.Started; } catch (System.Exception) { _state = State.Stopped; _stoppedTcs = null; _socket.Dispose(); Cleanup(); throw; } } return(Task.CompletedTask); }
public void Initialize() { // These members need to be Disposed EPoll = EPoll.Create(); EPollFd = EPoll.DangerousGetHandle().ToInt32(); PipeFactory = new PipeFactory(); PipeEnds = PipeEnd.CreatePair(blocking: false); }
public unsafe ThreadContext(TransportThread transportThread) { _transportThread = transportThread; _connectionDispatcher = transportThread.ConnectionDispatcher; _sockets = new Dictionary <int, TSocket>(); _logger = _transportThread.LoggerFactory.CreateLogger($"{nameof(RedHatX)}.{nameof(TransportThread)}.{_transportThread.ThreadId}"); _acceptSockets = new List <TSocket>(); _transportOptions = transportThread.TransportOptions; _scheduledSendAdding = new List <ScheduledSend>(1024); _scheduledSendRunning = new List <ScheduledSend>(1024); _epollState = EPollBlocked; if (_transportOptions.AioReceive | _transportOptions.AioSend) { _aioEventsMemory = AllocMemory(sizeof(AioEvent) * EventBufferLength); _aioCbsMemory = AllocMemory(sizeof(AioCb) * EventBufferLength); _aioCbsTableMemory = AllocMemory(sizeof(AioCb *) * EventBufferLength); _ioVectorTableMemory = AllocMemory(sizeof(IOVector) * IoVectorsPerAioSocket * EventBufferLength); for (int i = 0; i < EventBufferLength; i++) { AioCbsTable[i] = &AioCbs[i]; } if (_transportOptions.AioSend) { _aioSendBuffers = new ReadOnlySequence <byte> [EventBufferLength]; } } int maxMemoryHandleCount = TSocket.MaxIOVectorReceiveLength; if (_transportOptions.AioReceive || _transportOptions.AioSend) { maxMemoryHandleCount = Math.Max(maxMemoryHandleCount, EventBufferLength); } if (_transportOptions.DeferSend) { maxMemoryHandleCount = Math.Max(maxMemoryHandleCount, TSocket.MaxIOVectorSendLength); } MemoryHandles = new MemoryHandle[maxMemoryHandleCount]; // These members need to be Disposed _epoll = EPoll.Create(); _epollFd = _epoll.DangerousGetHandle().ToInt32(); MemoryPool = CreateMemoryPool(); _pipeEnds = PipeEnd.CreatePair(blocking: false); if (_aioEventsMemory != IntPtr.Zero) { AioInterop.IoSetup(EventBufferLength, out _aioContext).ThrowOnError(); } }