X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=python-eventlet%2Feventlet%2Fgreenio%2Fpy3.py;h=f2248e15ee783fa46abd5c6f433afbfb4b8d06c8;hb=refs%2Fheads%2Fmaster;hp=338ac687ee11cd12b32240e4ed5752a5014c4bbd;hpb=358bd9258c2b6d2ee74de4dfd07a5123107abad4;p=packages%2Ftrusty%2Fpython-eventlet.git diff --git a/python-eventlet/eventlet/greenio/py3.py b/python-eventlet/eventlet/greenio/py3.py index 338ac68..f2248e1 100644 --- a/python-eventlet/eventlet/greenio/py3.py +++ b/python-eventlet/eventlet/greenio/py3.py @@ -75,10 +75,26 @@ class GreenFileIO(_OriginalIOBase): def fileno(self): return self._fileno - def read(self, buflen): + def read(self, size=-1): + if size == -1: + return self.readall() + + while True: + try: + return _original_os.read(self._fileno, size) + except OSError as e: + if get_errno(e) not in SOCKET_BLOCKING: + raise IOError(*e.args) + self._trampoline(self, read=True) + + def readall(self): + buf = [] while True: try: - return _original_os.read(self._fileno, buflen) + chunk = _original_os.read(self._fileno, DEFAULT_BUFFER_SIZE) + if chunk == b'': + return b''.join(buf) + buf.append(chunk) except OSError as e: if get_errno(e) not in SOCKET_BLOCKING: raise IOError(*e.args) @@ -116,14 +132,19 @@ class GreenFileIO(_OriginalIOBase): self._closed = True def write(self, data): - while True: + view = memoryview(data) + datalen = len(data) + offset = 0 + while offset < datalen: try: - return _original_os.write(self._fileno, data) + written = _original_os.write(self._fileno, view[offset:]) except OSError as e: if get_errno(e) not in SOCKET_BLOCKING: raise IOError(*e.args) - else: - trampoline(self, write=True) + trampoline(self, write=True) + else: + offset += written + return offset def close(self): if not self._closed: