Ticket #1918: kqreactor_patch.diff
| File kqreactor_patch.diff, 4.0 KB (added by psykidellic, 4 years ago) |
|---|
-
kqreactor.py
old new 65 65 66 66 from zope.interface import implements 67 67 68 from kqsyscall import EVFILT_READ, EVFILT_WRITE, EV_DELETE, EV_ADD 69 from kqsyscall import kqueue, kevent 68 try: 69 import select26 as select 70 except ImportError: 71 import select 72 73 # from kqsyscall import EVFILT_READ, EVFILT_WRITE, EV_DELETE, EV_ADD 74 # from kqsyscall import kqueue, kevent 70 75 71 76 from twisted.internet.interfaces import IReactorFDSet 72 77 … … 105 110 Initialize kqueue object, file descriptor tracking dictionaries, and the 106 111 base class. 107 112 """ 108 self._kq = kqueue()113 self._kq = select.kqueue() 109 114 self._reads = {} 110 115 self._writes = {} 111 116 self._selectables = {} … … 113 118 114 119 115 120 def _updateRegistration(self, *args): 116 self._kq. kevent([kevent(*args)], 0, 0)121 self._kq.control([select.kevent(*args)], 0, 0) 117 122 118 123 def addReader(self, reader): 119 124 """Add a FileDescriptor for notification of data available to read. … … 122 127 if fd not in self._reads: 123 128 self._selectables[fd] = reader 124 129 self._reads[fd] = 1 125 self._updateRegistration(fd, EVFILT_READ,EV_ADD)130 self._updateRegistration(fd, select.KQ_FILTER_READ, select.KQ_EV_ADD) 126 131 127 132 def addWriter(self, writer): 128 133 """Add a FileDescriptor for notification of data available to write. … … 131 136 if fd not in self._writes: 132 137 self._selectables[fd] = writer 133 138 self._writes[fd] = 1 134 self._updateRegistration(fd, EVFILT_WRITE,EV_ADD)139 self._updateRegistration(fd, select.KQ_FILTER_WRITE, select.KQ_EV_ADD) 135 140 136 141 def removeReader(self, reader): 137 142 """Remove a Selectable for notification of data available to read. … … 141 146 del self._reads[fd] 142 147 if fd not in self._writes: 143 148 del self._selectables[fd] 144 self._updateRegistration(fd, EVFILT_READ,EV_DELETE)149 self._updateRegistration(fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE) 145 150 146 151 def removeWriter(self, writer): 147 152 """Remove a Selectable for notification of data available to write. … … 151 156 del self._writes[fd] 152 157 if fd not in self._reads: 153 158 del self._selectables[fd] 154 self._updateRegistration(fd, EVFILT_WRITE,EV_DELETE)159 self._updateRegistration(fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE) 155 160 156 161 def removeAll(self): 157 162 """Remove all selectables, and return a list of them.""" … … 159 164 self.removeReader(self.waker) 160 165 result = self._selectables.values() 161 166 for fd in self._reads.keys(): 162 self._updateRegistration(fd, EVFILT_READ,EV_DELETE)167 self._updateRegistration(fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE) 163 168 for fd in self._writes.keys(): 164 self._updateRegistration(fd, EVFILT_WRITE,EV_DELETE)169 self._updateRegistration(fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE) 165 170 self._reads.clear() 166 171 self._writes.clear() 167 172 self._selectables.clear() … … 186 191 timeout = int(timeout * 1000) # convert seconds to milliseconds 187 192 188 193 try: 189 l = self._kq. kevent([], len(self._selectables), timeout)194 l = self._kq.control([], len(self._selectables), timeout) 190 195 except OSError, e: 191 196 if e[0] == errno.EINTR: 192 197 return … … 206 211 207 212 def _doWriteOrRead(self, selectable, fd, filter): 208 213 try: 209 if filter == EVFILT_READ:214 if filter == select.KQ_FILTER_READ: 210 215 why = selectable.doRead() 211 if filter == EVFILT_WRITE:216 if filter == select.KQ_FILTER_WRITE: 212 217 why = selectable.doWrite() 213 218 if not selectable.fileno() == fd: 214 219 why = main.CONNECTION_LOST
