diff -r 546cad3627e2 Lib/selectors.py --- a/Lib/selectors.py Thu Dec 05 22:47:19 2013 +0100 +++ b/Lib/selectors.py Thu Dec 05 15:13:18 2013 -0800 @@ -89,6 +89,15 @@ Returns: SelectorKey instance + + Raises: + ValueError if events is invalid + KeyError if fileobj is already registered + OSError if fileobj is closed or otherwise is unacceptable to + the underlying system call (if a system call is made) + + Note: + OSError may or may not be raised """ raise NotImplementedError @@ -101,6 +110,13 @@ Returns: SelectorKey instance + + Raises: + KeyError if fileobj is not registered + + Note: + If fileobj is registered but has since been closed this does + *not* raise OSError (even if the wrapped syscall does) """ raise NotImplementedError @@ -114,6 +130,9 @@ Returns: SelectorKey instance + + Raises: + Anything that unregister() or register() raises """ self.unregister(fileobj) return self.register(fileobj, events, data) @@ -305,7 +324,10 @@ def unregister(self, fileobj): key = super().unregister(fileobj) - self._poll.unregister(key.fd) + try: + self._poll.unregister(key.fd) + except OSError: + pass return key def select(self, timeout=None): @@ -352,7 +374,10 @@ def unregister(self, fileobj): key = super().unregister(fileobj) - self._epoll.unregister(key.fd) + try: + self._epoll.unregister(key.fd) + except OSError: + pass return key def select(self, timeout=None): @@ -409,11 +434,17 @@ if key.events & EVENT_READ: kev = select.kevent(key.fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE) - self._kqueue.control([kev], 0, 0) + try: + self._kqueue.control([kev], 0, 0) + except OSError: + pass if key.events & EVENT_WRITE: kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE) - self._kqueue.control([kev], 0, 0) + try: + self._kqueue.control([kev], 0, 0) + except OSError: + pass return key def select(self, timeout=None):