Simple wrapper to :class:`~select.select`, using :`~select.poll`. Arguments: readers (Set[Fd]): Set of reader fds to test if readable. writers (Set[Fd]): Set of writer fds to test if writable. err (Set[Fd]): Set of fds to test for error condition. All fd sets passed
(readers=None, writers=None, err=None, timeout=0,
poll=_select_imp)
| 148 | |
| 149 | |
| 150 | def _select(readers=None, writers=None, err=None, timeout=0, |
| 151 | poll=_select_imp): |
| 152 | """Simple wrapper to :class:`~select.select`, using :`~select.poll`. |
| 153 | |
| 154 | Arguments: |
| 155 | readers (Set[Fd]): Set of reader fds to test if readable. |
| 156 | writers (Set[Fd]): Set of writer fds to test if writable. |
| 157 | err (Set[Fd]): Set of fds to test for error condition. |
| 158 | |
| 159 | All fd sets passed must be mutable as this function |
| 160 | will remove non-working fds from them, this also means |
| 161 | the caller must make sure there are still fds in the sets |
| 162 | before calling us again. |
| 163 | |
| 164 | Returns: |
| 165 | Tuple[Set, Set, Set]: of ``(readable, writable, again)``, where |
| 166 | ``readable`` is a set of fds that have data available for read, |
| 167 | ``writable`` is a set of fds that's ready to be written to |
| 168 | and ``again`` is a flag that if set means the caller must |
| 169 | throw away the result and call us again. |
| 170 | """ |
| 171 | readers = set() if readers is None else readers |
| 172 | writers = set() if writers is None else writers |
| 173 | err = set() if err is None else err |
| 174 | try: |
| 175 | return poll(readers, writers, err, timeout) |
| 176 | except OSError as exc: |
| 177 | _errno = exc.errno |
| 178 | |
| 179 | if _errno == errno.EINTR: |
| 180 | return set(), set(), 1 |
| 181 | elif _errno in SELECT_BAD_FD: |
| 182 | for fd in readers | writers | err: |
| 183 | try: |
| 184 | select.select([fd], [], [], 0) |
| 185 | except OSError as exc: |
| 186 | _errno = exc.errno |
| 187 | |
| 188 | if _errno not in SELECT_BAD_FD: |
| 189 | raise |
| 190 | readers.discard(fd) |
| 191 | writers.discard(fd) |
| 192 | err.discard(fd) |
| 193 | return set(), set(), 1 |
| 194 | else: |
| 195 | raise |
| 196 | |
| 197 | |
| 198 | def iterate_file_descriptors_safely(fds_iter, source_data, |
no test coverage detected