Author: Brian Kearns <[email protected]>
Branch: use-file-star-for-file
Changeset: r73464:12e45d6f7dbf
Date: 2014-09-11 13:48 -0400
http://bitbucket.org/pypy/pypy/changeset/12e45d6f7dbf/

Log:    handle eintr in rfile readline

diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -478,50 +478,71 @@
             return s.build()
         else:  # size > 0 or self._univ_newline
             ll_file = self._ll_file
+            newlinetypes = self._newlinetypes
+            skipnextlf = self._skipnextlf
             c = 0
             s = StringBuilder()
-            if self._univ_newline:
-                newlinetypes = self._newlinetypes
-                skipnextlf = self._skipnextlf
-                while size < 0 or s.getlength() < size:
-                    c = c_getc(ll_file)
+            while True:
+                if self._univ_newline:
+                    while size < 0 or s.getlength() < size:
+                        c = c_getc(ll_file)
+                        if c == EOF:
+                            break
+                        if skipnextlf:
+                            skipnextlf = False
+                            if c == ord('\n'):
+                                newlinetypes |= NEWLINE_CRLF
+                                c = c_getc(ll_file)
+                                if c == EOF:
+                                    break
+                            else:
+                                newlinetypes |= NEWLINE_CR
+                        if c == ord('\r'):
+                            skipnextlf = True
+                            c = ord('\n')
+                        elif c == ord('\n'):
+                            newlinetypes |= NEWLINE_LF
+                        s.append(chr(c))
+                        if c == ord('\n'):
+                            break
                     if c == EOF:
-                        break
-                    if skipnextlf:
-                        skipnextlf = False
+                        if c_ferror(ll_file) and rposix.get_errno() == 
errno.EINTR:
+                            self._newlinetypes = newlinetypes
+                            self._skipnextlf = skipnextlf
+                            if self._signal_checker is not None:
+                                self._signal_checker()
+                            c_clearerr(ll_file)
+                            continue
+                        if skipnextlf:
+                            newlinetypes |= NEWLINE_CR
+                else:
+                    while s.getlength() < size:
+                        c = c_getc(ll_file)
+                        if c == EOF:
+                            break
+                        s.append(chr(c))
                         if c == ord('\n'):
-                            newlinetypes |= NEWLINE_CRLF
-                            c = c_getc(ll_file)
-                            if c == EOF:
-                                break
-                        else:
-                            newlinetypes |= NEWLINE_CR
-                    if c == ord('\r'):
-                        skipnextlf = True
-                        c = ord('\n')
-                    elif c == ord('\n'):
-                        newlinetypes |= NEWLINE_LF
-                    s.append(chr(c))
-                    if c == ord('\n'):
-                        break
-                if c == EOF:
-                    if skipnextlf:
-                        newlinetypes |= NEWLINE_CR
+                            break
                 self._newlinetypes = newlinetypes
                 self._skipnextlf = skipnextlf
-            else:
-                while s.getlength() < size:
-                    c = c_getc(ll_file)
-                    if c == EOF:
-                        break
-                    s.append(chr(c))
-                    if c == ord('\n'):
-                        break
-            if c == EOF:
-                if c_ferror(ll_file):
+                if c == ord('\n'):
+                    break
+                elif c == EOF:
+                    if c_ferror(ll_file):
+                        if rposix.get_errno() == errno.EINTR:
+                            if self._signal_checker is not None:
+                                self._signal_checker()
+                            c_clearerr(ll_file)
+                            continue
+                        c_clearerr(ll_file)
+                        raise _from_errno(IOError)
                     c_clearerr(ll_file)
-                    raise _from_errno(IOError)
-                c_clearerr(ll_file)
+                    if self._signal_checker is not None:
+                        self._signal_checker()
+                    break
+                else:
+                    assert s.getlength() == size
+                    break
             return s.build()
 
     @enforceargs(None, str)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to