(self)
| 132 | return |
| 133 | |
| 134 | def _worker(self): |
| 135 | try: |
| 136 | with selectors.DefaultSelector() as sel: |
| 137 | sel.register(self._socket, selectors.EVENT_READ, self._read) |
| 138 | sel.register( |
| 139 | self._receive_wakeup, selectors.EVENT_READ, self._drain_wakeup |
| 140 | ) |
| 141 | while not self._done: |
| 142 | (expiration, interval) = self._get_timer_values(False) |
| 143 | items = sel.select(interval) |
| 144 | for key, _ in items: |
| 145 | key.data() |
| 146 | with self._lock: |
| 147 | self._handle_timer(expiration) |
| 148 | self._handle_events() |
| 149 | with self._lock: |
| 150 | datagrams = self._connection.datagrams_to_send(time.time()) |
| 151 | for datagram, _ in datagrams: |
| 152 | try: |
| 153 | self._socket.send(datagram) |
| 154 | except BlockingIOError: |
| 155 | # we let QUIC handle any lossage |
| 156 | pass |
| 157 | except Exception: |
| 158 | # Eat all exceptions as we have no way to pass them back to the |
| 159 | # caller currently. It might be nice to fix this in the future. |
| 160 | pass |
| 161 | finally: |
| 162 | with self._lock: |
| 163 | self._done = True |
| 164 | self._socket.close() |
| 165 | # Ensure anyone waiting for this gets woken up. |
| 166 | self._handshake_complete.set() |
| 167 | |
| 168 | def _handle_events(self): |
| 169 | while True: |
nothing calls this directly
no test coverage detected