Proactor implementation using IOCP.
| 415 | |
| 416 | |
| 417 | class IocpProactor: |
| 418 | """Proactor implementation using IOCP.""" |
| 419 | |
| 420 | def __init__(self, concurrency=INFINITE): |
| 421 | self._loop = None |
| 422 | self._results = [] |
| 423 | self._iocp = _overlapped.CreateIoCompletionPort( |
| 424 | _overlapped.INVALID_HANDLE_VALUE, NULL, 0, concurrency) |
| 425 | self._cache = {} |
| 426 | self._registered = weakref.WeakSet() |
| 427 | self._unregistered = [] |
| 428 | self._stopped_serving = weakref.WeakSet() |
| 429 | |
| 430 | def _check_closed(self): |
| 431 | if self._iocp is None: |
| 432 | raise RuntimeError('IocpProactor is closed') |
| 433 | |
| 434 | def __repr__(self): |
| 435 | info = ['overlapped#=%s' % len(self._cache), |
| 436 | 'result#=%s' % len(self._results)] |
| 437 | if self._iocp is None: |
| 438 | info.append('closed') |
| 439 | return '<%s %s>' % (self.__class__.__name__, " ".join(info)) |
| 440 | |
| 441 | def set_loop(self, loop): |
| 442 | self._loop = loop |
| 443 | |
| 444 | def select(self, timeout=None): |
| 445 | if not self._results: |
| 446 | self._poll(timeout) |
| 447 | tmp = self._results |
| 448 | self._results = [] |
| 449 | try: |
| 450 | return tmp |
| 451 | finally: |
| 452 | # Needed to break cycles when an exception occurs. |
| 453 | tmp = None |
| 454 | |
| 455 | def _result(self, value): |
| 456 | fut = self._loop.create_future() |
| 457 | fut.set_result(value) |
| 458 | return fut |
| 459 | |
| 460 | @staticmethod |
| 461 | def finish_socket_func(trans, key, ov): |
| 462 | try: |
| 463 | return ov.getresult() |
| 464 | except OSError as exc: |
| 465 | if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED, |
| 466 | _overlapped.ERROR_OPERATION_ABORTED): |
| 467 | raise ConnectionResetError(*exc.args) |
| 468 | else: |
| 469 | raise |
| 470 | |
| 471 | @classmethod |
| 472 | def _finish_recvfrom(cls, trans, key, ov, *, empty_result): |
| 473 | try: |
| 474 | return cls.finish_socket_func(trans, key, ov) |
no outgoing calls
no test coverage detected
searching dependent graphs…