A poller which uses poll(), available on most UNIXen.
(timeout=0.0, map=None)
| 251 | current_thread().stop.wait(timeout) |
| 252 | |
| 253 | def poll_poller(timeout=0.0, map=None): |
| 254 | """A poller which uses poll(), available on most UNIXen.""" |
| 255 | if map is None: |
| 256 | map = socket_map |
| 257 | if timeout is not None: |
| 258 | # timeout is in milliseconds |
| 259 | timeout = int(timeout*1000) |
| 260 | try: |
| 261 | poll_poller.pollster |
| 262 | except AttributeError: |
| 263 | poll_poller.pollster = select.poll() |
| 264 | if map: |
| 265 | for fd, obj in list(map.items()): |
| 266 | flags = newflags = 0 |
| 267 | if obj.readable(): |
| 268 | flags |= select.POLLIN | select.POLLPRI |
| 269 | newflags |= OP_READ |
| 270 | else: |
| 271 | newflags &= ~ OP_READ |
| 272 | # accepting sockets should not be writable |
| 273 | if obj.writable() and not obj.accepting: |
| 274 | flags |= select.POLLOUT |
| 275 | newflags |= OP_WRITE |
| 276 | else: |
| 277 | newflags &= ~ OP_WRITE |
| 278 | if newflags != obj.poller_flags: |
| 279 | obj.poller_flags = newflags |
| 280 | try: |
| 281 | if obj.poller_registered: |
| 282 | poll_poller.pollster.modify(fd, flags) |
| 283 | else: |
| 284 | poll_poller.pollster.register(fd, flags) |
| 285 | obj.poller_registered = True |
| 286 | except IOError: |
| 287 | pass |
| 288 | try: |
| 289 | r = poll_poller.pollster.poll(timeout) |
| 290 | except KeyboardInterrupt: |
| 291 | r = [] |
| 292 | except socket.error as err: |
| 293 | if err.args[0] in (EBADF, WSAENOTSOCK, EINTR): |
| 294 | return |
| 295 | for fd, flags in random.sample(r, len(r)): |
| 296 | obj = map.get(fd) |
| 297 | if obj is None: |
| 298 | continue |
| 299 | readwrite(obj, flags) |
| 300 | else: |
| 301 | current_thread().stop.wait(timeout) |
| 302 | |
| 303 | # Aliases for backward compatibility |
| 304 | poll = select_poller |