Ticket #5158: twisted_std_epoll.2.patch
| File twisted_std_epoll.2.patch, 5.1 KB (added by jell, 18 months ago) |
|---|
-
python/_epoll.pyx
124 124 if result == -1: 125 125 raise IOError(errno, strerror(errno)) 126 126 127 def wait(self, unsigned int maxevents, int timeout): 127 def register(self, int fd, int eventmask=0): 128 self._control(CTL_ADD, fd, eventmask) 129 130 def unregister(self, int fd): 131 self._control(CTL_ADD, fd) 132 133 def modify(self, inft fd, int eventmask): 134 self._control(CTL_MOD, fd, eventmask) 135 136 def poll(self, unsigned int maxevents, int timeout): 128 137 """ 129 Waitfor an I/O event, wrap epoll_wait(2).138 Poll for an I/O event, wrap epoll_wait(2). 130 139 131 140 @type maxevents: C{int} 132 141 @param maxevents: Maximum number of events returned. … … 166 175 CTL_DEL = EPOLL_CTL_DEL 167 176 CTL_MOD = EPOLL_CTL_MOD 168 177 169 IN = EPOLLIN170 OUT = EPOLLOUT171 PRI = EPOLLPRI172 E RR = EPOLLERR173 HUP = EPOLLHUP174 E T = EPOLLET178 EPOLLIN = EPOLLIN 179 EPOLLOUT = EPOLLOUT 180 EPOLLPRI = EPOLLPRI 181 EPOLLERR = EPOLLERR 182 EPOLLHUP = EPOLLHUP 183 EPOLLET = EPOLLET 175 184 176 RDNORM = EPOLLRDNORM177 RDBAND = EPOLLRDBAND178 WRNORM = EPOLLWRNORM179 WRBAND = EPOLLWRBAND180 MSG = EPOLLMSG185 EPOLLRDNORM = EPOLLRDNORM 186 EPOLLRDBAND = EPOLLRDBAND 187 EPOLLWRNORM = EPOLLWRNORM 188 EPOLLWRBAND = EPOLLWRBAND 189 EPOLLMSG = EPOLLMSG 181 190 -
internet/epollreactor.py
17 17 18 18 from twisted.internet.interfaces import IReactorFDSet 19 19 20 from twisted.python import log, _epoll 20 from twisted.python import log 21 try: 22 from select import epoll as _epoll 23 except ImportError: 24 from twisted.python import _epoll 25 21 26 from twisted.internet import posixbase 22 27 23 28 … … 49 54 implements(IReactorFDSet) 50 55 51 56 # Attributes for _PollLikeMixin 52 _POLL_DISCONNECTED = (_epoll. HUP | _epoll.ERR)53 _POLL_IN = _epoll. IN54 _POLL_OUT = _epoll. OUT57 _POLL_DISCONNECTED = (_epoll.EPOLLHUP | _epoll.EPOLLERR) 58 _POLL_IN = _epoll.EPOLLIN 59 _POLL_OUT = _epoll.EPOLLOUT 55 60 56 61 def __init__(self): 57 62 """ … … 76 81 """ 77 82 fd = xer.fileno() 78 83 if fd not in primary: 79 cmd = _epoll.CTL_ADD84 cmd = self._poller.register 80 85 flags = event 81 86 if fd in other: 82 87 flags |= antievent 83 cmd = _epoll.CTL_MOD88 cmd = self._poller.modify 84 89 # epoll_ctl can raise all kinds of IOErrors, and every one 85 90 # indicates a bug either in the reactor or application-code. 86 91 # Let them all through so someone sees a traceback and fixes 87 92 # something. We'll do the same thing for every other call to 88 93 # this method in this file. 89 self._poller._control(cmd,fd, flags)94 cmd(fd, flags) 90 95 91 96 # Update our own tracking state *only* after the epoll call has 92 97 # succeeded. Otherwise we may get out of sync. … … 98 103 """ 99 104 Add a FileDescriptor for notification of data available to read. 100 105 """ 101 self._add(reader, self._reads, self._writes, self._selectables, _epoll.IN, _epoll. OUT)106 self._add(reader, self._reads, self._writes, self._selectables, _epoll.IN, _epoll.EPOLLOUT) 102 107 103 108 104 109 def addWriter(self, writer): 105 110 """ 106 111 Add a FileDescriptor for notification of data available to write. 107 112 """ 108 self._add(writer, self._writes, self._reads, self._selectables, _epoll.OUT, _epoll. IN)113 self._add(writer, self._writes, self._reads, self._selectables, _epoll.OUT, _epoll.EPOLLIN) 109 114 110 115 111 116 def _remove(self, xer, primary, other, selectables, event, antievent): … … 123 128 else: 124 129 return 125 130 if fd in primary: 126 cmd = _epoll.CTL_DEL127 131 flags = event 128 132 if fd in other: 129 133 flags = antievent 130 cmd = _epoll.CTL_MOD134 self._poller.modify(fd, flags) 131 135 else: 136 self._poller.unregister(fd) 132 137 del selectables[fd] 133 138 del primary[fd] 134 # See comment above _control call in _add.135 self._poller._control(cmd, fd, flags)136 139 137 140 138 141 def removeReader(self, reader): 139 142 """ 140 143 Remove a Selectable for notification of data available to read. 141 144 """ 142 self._remove(reader, self._reads, self._writes, self._selectables, _epoll. IN, _epoll.OUT)145 self._remove(reader, self._reads, self._writes, self._selectables, _epoll.EPOLLIN, _epoll.EPOLLOUT) 143 146 144 147 145 148 def removeWriter(self, writer): … … 178 181 # currently tracking (because that's maybe a good heuristic) and 179 182 # the amount of time we block to the value specified by our 180 183 # caller. 181 l = self._poller. wait(len(self._selectables), timeout)184 l = self._poller.poll(len(self._selectables), timeout) 182 185 except IOError, err: 183 186 if err.errno == errno.EINTR: 184 187 return
