Author: Armin Rigo <[email protected]>
Branch: py3.5-eintr-pep475
Changeset: r88874:c9e018812658
Date: 2016-12-04 11:39 +0100
http://bitbucket.org/pypy/pypy/changeset/c9e018812658/
Log: first try at the _io module
diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -175,46 +175,48 @@
"Cannot use closefd=False with file name")
from pypy.module.posix.interp_posix import dispatch_filename
- try:
- self.fd = dispatch_filename(rposix.open)(
- space, w_name, flags, 0666)
- except OSError as e:
- raise wrap_oserror2(space, e, w_name,
- exception_name='w_IOError')
- finally:
- fd_is_own = True
+ while True:
+ try:
+ self.fd = dispatch_filename(rposix.open)(
+ space, w_name, flags, 0666)
+ fd_is_own = True
+ break
+ except OSError as e:
+ wrap_oserror2(space, e, w_name,
+ exception_name='w_IOError',
+ eintr_retry=True)
if not rposix._WIN32:
try:
_open_inhcache.set_non_inheritable(self.fd)
except OSError as e:
- raise wrap_oserror2(space, e, w_name)
+ raise wrap_oserror2(space, e, w_name,
eintr_retry=False)
else:
w_fd = space.call_function(w_opener, w_name, space.wrap(flags))
try:
self.fd = space.int_w(w_fd)
+ fd_is_own = True
except OperationError as e:
if not e.match(space, space.w_TypeError):
raise
raise oefmt(space.w_TypeError,
"expected integer from opener")
- finally:
- fd_is_own = True
if not rposix._WIN32:
try:
rposix.set_inheritable(self.fd, False)
except OSError as e:
- raise wrap_oserror2(space, e, w_name)
+ raise wrap_oserror2(space, e, w_name,
eintr_retry=False)
try:
st = os.fstat(self.fd)
except OSError as e:
- raise wrap_oserror(space, e)
+ raise wrap_oserror(space, e, eintr_retry=False)
# On Unix, fopen will succeed for directories.
# In Python, there should be no file objects referring to
# directories, so we need a check.
if stat.S_ISDIR(st.st_mode):
raise wrap_oserror2(space, OSError(errno.EISDIR, "fstat"),
- w_name, exception_name='w_IOError')
+ w_name, exception_name='w_IOError',
+ eintr_retry=False)
self.blksize = DEFAULT_BUFFER_SIZE
if HAS_BLKSIZE and st.st_blksize > 1:
self.blksize = st.st_blksize
@@ -227,7 +229,8 @@
try:
os.lseek(self.fd, 0, os.SEEK_END)
except OSError as e:
- raise wrap_oserror(space, e, exception_name='w_IOError')
+ raise wrap_oserror(space, e, exception_name='w_IOError',
+ eintr_retry=False)
except:
if not fd_is_own:
self.fd = -1
@@ -285,7 +288,8 @@
os.close(fd)
except OSError as e:
raise wrap_oserror(space, e,
- exception_name='w_IOError')
+ exception_name='w_IOError',
+ eintr_retry=False)
def close_w(self, space):
try:
@@ -319,7 +323,8 @@
pos = os.lseek(self.fd, pos, whence)
except OSError as e:
raise wrap_oserror(space, e,
- exception_name='w_IOError')
+ exception_name='w_IOError',
+ eintr_retry=False)
return space.wrap(pos)
def tell_w(self, space):
@@ -328,7 +333,8 @@
pos = os.lseek(self.fd, 0, 1)
except OSError as e:
raise wrap_oserror(space, e,
- exception_name='w_IOError')
+ exception_name='w_IOError',
+ eintr_retry=False)
return space.wrap(pos)
def readable_w(self, space):
@@ -361,7 +367,8 @@
try:
res = os.isatty(self.fd)
except OSError as e:
- raise wrap_oserror(space, e, exception_name='w_IOError')
+ raise wrap_oserror(space, e, exception_name='w_IOError',
+ eintr_retry=False)
return space.wrap(res)
def repr_w(self, space):
@@ -387,13 +394,16 @@
self._check_writable(space)
data = space.getarg_w('y*', w_data).as_str()
- try:
- n = os.write(self.fd, data)
- except OSError as e:
- if e.errno == errno.EAGAIN:
- return space.w_None
- raise wrap_oserror(space, e,
- exception_name='w_IOError')
+ while True:
+ try:
+ n = os.write(self.fd, data)
+ break
+ except OSError as e:
+ if e.errno == errno.EAGAIN:
+ return space.w_None
+ wrap_oserror(space, e,
+ exception_name='w_IOError',
+ eintr_retry=True)
return space.wrap(n)
@@ -405,13 +415,16 @@
if size < 0:
return self.readall_w(space)
- try:
- s = os.read(self.fd, size)
- except OSError as e:
- if e.errno == errno.EAGAIN:
- return space.w_None
- raise wrap_oserror(space, e,
- exception_name='w_IOError')
+ while True:
+ try:
+ s = os.read(self.fd, size)
+ break
+ except OSError as e:
+ if e.errno == errno.EAGAIN:
+ return space.w_None
+ wrap_oserror(space, e,
+ exception_name='w_IOError',
+ eintr_retry=True)
return space.newbytes(s)
@@ -420,13 +433,16 @@
self._check_readable(space)
rwbuffer = space.getarg_w('w*', w_buffer)
length = rwbuffer.getlength()
- try:
- buf = os.read(self.fd, length)
- except OSError as e:
- if e.errno == errno.EAGAIN:
- return space.w_None
- raise wrap_oserror(space, e,
- exception_name='w_IOError')
+ while True:
+ try:
+ buf = os.read(self.fd, length)
+ break
+ except OSError as e:
+ if e.errno == errno.EAGAIN:
+ return space.w_None
+ wrap_oserror(space, e,
+ exception_name='w_IOError',
+ eintr_retry=True)
rwbuffer.setslice(0, buf)
return space.wrap(len(buf))
@@ -442,17 +458,12 @@
try:
chunk = os.read(self.fd, newsize - total)
except OSError as e:
- if e.errno == errno.EINTR:
- space.getexecutioncontext().checksignals()
- continue
- if total > 0:
- # return what we've got so far
- break
if e.errno == errno.EAGAIN:
+ if total > 0:
+ break # return what we've got so far
return space.w_None
- raise wrap_oserror(space, e,
- exception_name='w_IOError')
-
+ wrap_oserror(space, e, exception_name='w_IOError',
+ eintr_retry=True)
if not chunk:
break
builder.append(chunk)
@@ -476,7 +487,8 @@
try:
self._truncate(space.r_longlong_w(w_size))
except OSError as e:
- raise wrap_oserror(space, e, exception_name='w_IOError')
+ raise wrap_oserror(space, e, exception_name='w_IOError',
+ eintr_retry=False)
return w_size
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit