def _trampoline(self, fd, read=False, write=False, timeout=None, timeout_exc=None): """ We need to trampoline via the event hub. We catch any signal back from the hub indicating that the operation we were waiting on was associated with a filehandle that's since been invalidated. """ if self._closed: # If we did any logging, alerting to a second trampoline attempt on a closed # socket here would be useful. raise IOClosed() try: return trampoline(fd, read=read, write=write, timeout=timeout, timeout_exc=timeout_exc, mark_as_closed=self._mark_as_closed) except IOClosed: # This socket's been obsoleted. De-fang it. self._mark_as_closed() raise
def close_one(self): """ Triggered from the apis run loop. If a listener's underlying FD was closed somehow, throw an exception back to the trampoline, which should be able to manage it appropriately. """ listener = self.closed.pop() if not listener.greenlet.dead: # There's no point signalling a greenlet that's already dead. listener.tb(IOClosed(errno.ENOTCONN, "Operation on closed file"))
def _trampoline(self, fd, read=False, write=False, timeout=None, timeout_exc=None): if self._closed: # Don't trampoline if we're already closed. raise IOClosed() try: return trampoline(fd, read=read, write=write, timeout=timeout, timeout_exc=timeout_exc, mark_as_closed=self._mark_as_closed) except IOClosed: # Our fileno has been obsoleted. Defang ourselves to # prevent spurious closes. self._mark_as_closed() raise
def _trampoline(self, **kw): """ We need to trampoline via the event hub. We catch any signal back from the hub indicating that the operation we were waiting on was associated with a filehandle that's since been invalidated. """ # todo, listener == self if self._closed: # If we did any logging, alerting to a second trampoline attempt on a closed # socket here would be useful. raise IOClosed() try: kw['mark_as_closed'] = self._mark_as_closed return trampoline(self.fd, **kw) except IOClosed: # This socket's been obsoleted. De-fang it. self._mark_as_closed() raise