private void AcceptOn(TSocket tsocket) { try { _acceptSockets.Add(tsocket); lock (_sockets) { _sockets.Add(tsocket.Fd, tsocket); } EPollInterop.EPollControl(_epollFd, EPollOperation.Add, tsocket.Fd, EPollEvents.Readable, EPollData(tsocket.Fd)); } catch { tsocket.Close(); _acceptSockets.Remove(tsocket); lock (_sockets) { _sockets.Remove(tsocket.Fd); } throw; } }
private void Start() { // register pipe EPollInterop.EPollControl(_epollFd, EPollOperation.Add, _pipeEnds.ReadEnd.DangerousGetHandle().ToInt32(), EPollEvents.Readable, EPollData(PipeKey)); // create accept socket { TSocket acceptSocket; SocketFlags flags = SocketFlags.None; if (_transportOptions.DeferSend) { flags |= SocketFlags.DeferSend; } ; if (_transportThread.AcceptThread != null) { flags |= SocketFlags.TypePassFd; int acceptSocketFd = _transportThread.AcceptThread.CreateReceiveSocket(); acceptSocket = new TSocket(this, acceptSocketFd, flags); acceptSocket.ZeroCopyThreshold = LinuxTransportOptions.NoZeroCopy; } else { flags |= SocketFlags.TypeAccept; acceptSocket = CreateAcceptSocket(_transportThread.EndPoint, flags); } // accept connections AcceptOn(acceptSocket); } }
private void AcceptOn(TSocket tsocket) { try { _acceptSockets.Add(tsocket); lock (_sockets) { _sockets.Add(tsocket.Fd, tsocket); } EPollInterop.EPollControl(_epollFd, EPOLL_CTL_ADD, tsocket.Fd, EPOLLIN, tsocket.Fd); } catch { tsocket.Close(); _acceptSockets.Remove(tsocket); lock (_sockets) { _sockets.Remove(tsocket.Fd); } throw; } }
// must be called under tsocket.Gate public void UpdateEPollControl(TSocket tsocket, EPollEvents flags, bool registered) { flags &= EPollEvents.Readable | EPollEvents.Writable | EPollEvents.Error; EPollInterop.EPollControl(_epollFd, registered ? EPollOperation.Modify : EPollOperation.Add, tsocket.Fd, flags | EPollEvents.OneShot, EPollData(tsocket.Fd)); }
// must be called under tsocket.Gate public void UpdateEPollControl(TSocket tsocket, int flags, bool registered) { flags &= EPOLLIN | EPOLLOUT | EPOLLERR; EPollInterop.EPollControl(_epollFd, registered ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, tsocket.Fd, flags | EPOLLONESHOT, tsocket.Fd); }
public PosixResult TryControl(int operation, SafeHandle fd, int events, int data) { return(EPollInterop.EPollControl(this, operation, fd, events, data)); }
public PosixResult TryControl(EPollOperation operation, SafeHandle fd, EPollEvents events, EPollData data) { return(EPollInterop.EPollControl(this, operation, fd, events, data.Long)); }