diff --git a/mitogen/core.py b/mitogen/core.py index 974b5209..0f0b5992 100644 --- a/mitogen/core.py +++ b/mitogen/core.py @@ -455,20 +455,20 @@ def io_op(func, *args): signalled by :data:`errno.EPIPE`. :returns: - Tuple of `(return_value, disconnected)`, where `return_value` is the - return value of `func(*args)`, and `disconnected` is :data:`True` if - disconnection was detected, otherwise :data:`False`. + Tuple of `(return_value, disconnect_reason)`, where `return_value` is + the return value of `func(*args)`, and `disconnected` is an exception + instance when disconnection was detected, otherwise :data:`None`. """ while True: try: - return func(*args), False + return func(*args), None except (select.error, OSError, IOError): e = sys.exc_info()[1] _vv and IOLOG.debug('io_op(%r) -> OSError: %s', func, e) if e.args[0] == errno.EINTR: continue if e.args[0] in (errno.EIO, errno.ECONNRESET, errno.EPIPE): - return None, True + return None, e raise diff --git a/mitogen/parent.py b/mitogen/parent.py index 2a864fa1..e4b1f66a 100644 --- a/mitogen/parent.py +++ b/mitogen/parent.py @@ -544,7 +544,8 @@ class IteratingRead(object): for fd in self.poller.poll(self.timeout): s, disconnected = mitogen.core.io_op(os.read, fd, 4096) if disconnected or not s: - IOLOG.debug('iter_read(%r) -> disconnected', fd) + LOG.debug('iter_read(%r) -> disconnected: %s', + fd, disconnected) self.poller.stop_receive(fd) else: IOLOG.debug('iter_read(%r) -> %r', fd, s)