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);
 }
Ejemplo n.º 6
0
 public PosixResult TryControl(int operation, SafeHandle fd, int events, int data)
 {
     return(EPollInterop.EPollControl(this, operation, fd, events, data));
 }
Ejemplo n.º 7
0
 public PosixResult TryControl(EPollOperation operation, SafeHandle fd, EPollEvents events, EPollData data)
 {
     return(EPollInterop.EPollControl(this, operation, fd, events, data.Long));
 }