Author: Antonio Cuni <anto.c...@gmail.com>
Branch: 
Changeset: r58665:d839e92c1304
Date: 2012-11-02 14:22 +0100
http://bitbucket.org/pypy/pypy/changeset/d839e92c1304/

Log:    merge

diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py
--- a/pypy/module/_file/interp_file.py
+++ b/pypy/module/_file/interp_file.py
@@ -179,7 +179,17 @@
         else:
             result = StringBuilder(n)
             while n > 0:
-                data = stream.read(n)
+                try:
+                    data = stream.read(n)
+                except OSError, e:
+                    # a special-case only for read() (similar to CPython, which
+                    # also looses partial data with other methods): if we get
+                    # EAGAIN after already some data was received, return it.
+                    if is_wouldblock_error(e):
+                        got = result.build()
+                        if len(got) > 0:
+                            return got
+                    raise
                 if not data:
                     break
                 n -= len(data)
@@ -570,6 +580,16 @@
 def getopenstreams(space):
     return space.fromcache(FileState).openstreams
 
+MAYBE_EAGAIN      = getattr(errno, 'EAGAIN',      None)
+MAYBE_EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', None)
+
+def is_wouldblock_error(e):
+    if MAYBE_EAGAIN is not None and e.errno == MAYBE_EAGAIN:
+        return True
+    if MAYBE_EWOULDBLOCK is not None and e.errno == MAYBE_EWOULDBLOCK:
+        return True
+    return False
+
 
 @unwrap_spec(file=W_File, encoding="str_or_None", errors="str_or_None")
 def set_file_encoding(space, file, encoding=None, errors=None):
diff --git a/pypy/module/_file/test/test_file_extra.py 
b/pypy/module/_file/test/test_file_extra.py
--- a/pypy/module/_file/test/test_file_extra.py
+++ b/pypy/module/_file/test/test_file_extra.py
@@ -354,7 +354,7 @@
 class AppTestAFewExtra:
 
     def setup_class(cls):
-        space = gettestobjspace(usemodules=('array',))
+        space = gettestobjspace(usemodules=('array', '_socket'))
         cls.space = space
 
     def setup_method(self, method):
@@ -606,3 +606,16 @@
                                   repr(unicode(self.temptestfile)))
         f.close()
 
+    def test_EAGAIN(self):
+        import _socket, posix
+        s1, s2 = _socket.socketpair()
+        s2.setblocking(False)
+        s1.send("hello")
+
+        f2 = posix.fdopen(posix.dup(s2.fileno()), 'rb', 0)
+        data = f2.read(12)
+        assert data == "hello"
+
+        f2.close()
+        s2.close()
+        s1.close()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to