Author: Armin Rigo <[email protected]>
Branch: py3.5-eintr-pep475
Changeset: r88871:63df1181a419
Date: 2016-12-04 10:19 +0100
http://bitbucket.org/pypy/pypy/changeset/63df1181a419/

Log:    Add eintr_retry=False systematically (the goal would be to remove
        the default value of the argument, to be sure we're complete)

diff --git a/pypy/module/posix/interp_posix.py 
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -251,7 +251,7 @@
     try:
         pos = os.lseek(fd, position, how)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     else:
         return space.wrap(pos)
 
@@ -262,7 +262,7 @@
     try:
         res = os.isatty(fd)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     else:
         return space.wrap(res)
 
@@ -300,7 +300,7 @@
     try:
         os.close(fd)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(fd_low=c_int, fd_high=c_int)
 def closerange(fd_low, fd_high):
@@ -487,7 +487,7 @@
             raise oefmt(space.w_NotImplementedError,
                 "%s: unsupported argument combination", funcname)
     except OSError as e:
-        raise wrap_oserror2(space, e, path.w_path)
+        raise wrap_oserror2(space, e, path.w_path, eintr_retry=False)
     else:
         return build_stat_result(space, st)
 
@@ -546,7 +546,7 @@
             rposix_stat.statvfs,
             allow_fd_fn=rposix_stat.fstatvfs)(space, w_path)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
     else:
         return build_statvfs_result(space, st)
 
@@ -558,17 +558,19 @@
     try:
         newfd = rposix.dup(fd, inheritable=False)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     else:
         return space.wrap(newfd)
 
 @unwrap_spec(fd=c_int, fd2=c_int, inheritable=bool)
 def dup2(space, fd, fd2, inheritable=1):
     """Duplicate a file descriptor."""
+    # like os.close(), this can still raise EINTR to app-level in
+    # CPython 3.5.2
     try:
         rposix.dup2(fd, fd2, inheritable)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(mode=c_int,
     dir_fd=DirFD(rposix.HAVE_FACCESSAT), effective_ids=bool,
@@ -613,7 +615,7 @@
         else:
             ok = dispatch_filename(rposix.access)(space, w_path, mode)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
     else:
         return space.wrap(ok)
 
@@ -627,7 +629,7 @@
     try:
         times = os.times()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     else:
         return space.newtuple([space.wrap(times[0]),
                                space.wrap(times[1]),
@@ -641,7 +643,7 @@
     try:
         rc = os.system(command)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     else:
         return space.wrap(rc)
 
@@ -662,7 +664,7 @@
         else:
             dispatch_filename(rposix.unlink)(space, w_path)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 @unwrap_spec(dir_fd=DirFD(rposix.HAVE_UNLINKAT))
 def remove(space, w_path, __kwonly__, dir_fd=DEFAULT_DIR_FD):
@@ -681,7 +683,7 @@
         else:
             dispatch_filename(rposix.unlink)(space, w_path)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 def _getfullpathname(space, w_path):
     """helper for ntpath.abspath """
@@ -695,7 +697,7 @@
             fullpath = rposix.getfullpathname(path)
             w_fullpath = space.newbytes(fullpath)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
     else:
         return w_fullpath
 
@@ -704,7 +706,7 @@
     try:
         cur = os.getcwd()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     else:
         return space.newbytes(cur)
 
@@ -714,7 +716,7 @@
         try:
             cur = os.getcwdu()
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
         else:
             return space.wrap(cur)
 else:
@@ -731,7 +733,7 @@
         else:
             dispatch_filename(rposix.chdir)(space, w_path)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 @unwrap_spec(mode=c_int, dir_fd=DirFD(rposix.HAVE_MKDIRAT))
 def mkdir(space, w_path, mode=0o777, __kwonly__=None, dir_fd=DEFAULT_DIR_FD):
@@ -752,7 +754,7 @@
         else:
             dispatch_filename(rposix.mkdir)(space, w_path, mode)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 @unwrap_spec(dir_fd=DirFD(rposix.HAVE_UNLINKAT))
 def rmdir(space, w_path, __kwonly__, dir_fd=DEFAULT_DIR_FD):
@@ -771,7 +773,7 @@
         else:
             dispatch_filename(rposix.rmdir)(space, w_path)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 @unwrap_spec(code=c_int)
 def strerror(space, code):
@@ -786,7 +788,7 @@
     try:
         cur = os.getlogin()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap_fsdecoded(cur)
 
 # ____________________________________________________________
@@ -839,7 +841,7 @@
         try:
             rwin32._wputenv(name, value)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
 else:
     def _convertenviron(space, w_env):
         for key, value in os.environ.items():
@@ -850,7 +852,7 @@
         try:
             dispatch_filename_2(rposix.putenv)(space, w_name, w_value)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
 
     def unsetenv(space, w_name):
         """Delete an environment variable."""
@@ -859,7 +861,7 @@
         except KeyError:
             pass
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
 
 
 def listdir(space, w_path=None):
@@ -882,7 +884,7 @@
         try:
             result = rposix.listdir(dirname)
         except OSError as e:
-            raise wrap_oserror2(space, e, w_path)
+            raise wrap_oserror2(space, e, w_path, eintr_retry=False)
         return space.newlist_bytes(result)
     try:
         path = space.fsencode_w(w_path)
@@ -896,13 +898,13 @@
         try:
             result = rposix.fdlistdir(os.dup(fd))
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
     else:
         dirname = FileEncoder(space, w_path)
         try:
             result = rposix.listdir(dirname)
         except OSError as e:
-            raise wrap_oserror2(space, e, w_path)
+            raise wrap_oserror2(space, e, w_path, eintr_retry=False)
     len_result = len(result)
     result_w = [None] * len_result
     for i in range(len_result):
@@ -917,14 +919,14 @@
     try:
         return space.wrap(rposix.get_inheritable(fd))
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(fd=c_int, inheritable=int)
 def set_inheritable(space, fd, inheritable):
     try:
         rposix.set_inheritable(fd, inheritable)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 _pipe_inhcache = rposix.SetNonInheritableCache()
 
@@ -933,14 +935,14 @@
     try:
         fd1, fd2 = rposix.pipe(rposix.O_CLOEXEC or 0)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     try:
         _pipe_inhcache.set_non_inheritable(fd1)
         _pipe_inhcache.set_non_inheritable(fd2)
     except OSError as e:
         rposix.c_close(fd2)
         rposix.c_close(fd1)
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newtuple([space.wrap(fd1), space.wrap(fd2)])
 
 @unwrap_spec(flags=c_int)
@@ -948,7 +950,7 @@
     try:
         fd1, fd2 = rposix.pipe2(flags)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newtuple([space.wrap(fd1), space.wrap(fd2)])
 
 @unwrap_spec(mode=c_int, dir_fd=DirFD(rposix.HAVE_FCHMODAT),
@@ -978,7 +980,7 @@
             dispatch_filename(rposix.chmod)(space, w_path, mode)
             return
         except OSError as e:
-            raise wrap_oserror2(space, e, w_path)
+            raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
     try:
         path = space.fsencode_w(w_path)
@@ -987,7 +989,12 @@
             raise oefmt(space.w_TypeError,
                 "argument should be string, bytes or integer, not %T", w_path)
         fd = unwrap_fd(space, w_path)
-        _chmod_fd(space, fd, mode)
+        # NB. CPython 3.5.2: unclear why os.chmod(fd) propagates EINTR
+        # to app-level, but os.fchmod(fd) retries automatically
+        try:
+            os.fchmod(fd, mode)
+        except OSError as e:
+            raise wrap_oserror(space, e, eintr_retry=False)
     else:
         try:
             _chmod_path(path, mode, dir_fd, follow_symlinks)
@@ -996,7 +1003,7 @@
                 # fchmodat() doesn't actually implement follow_symlinks=False
                 # so raise NotImplementedError in this case
                 raise argument_unavailable(space, "chmod", "follow_symlinks")
-            raise wrap_oserror2(space, e, w_path)
+            raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 def _chmod_path(path, mode, dir_fd, follow_symlinks):
     if dir_fd != DEFAULT_DIR_FD or not follow_symlinks:
@@ -1004,7 +1011,13 @@
     else:
         rposix.chmod(path, mode)
 
-def _chmod_fd(space, fd, mode):
+@unwrap_spec(fd=c_int, mode=c_int)
+def fchmod(space, fd, mode):
+    """\
+    Change the access permissions of the file given by file descriptor fd.
+    """
+    # NB. CPython 3.5.2: unclear why os.chmod(fd) propagates EINTR
+    # to app-level, but os.fchmod(fd) retries automatically
     while True:
         try:
             os.fchmod(fd, mode)
@@ -1012,14 +1025,6 @@
         except OSError as e:
             wrap_oserror(space, e, eintr_retry=True)
 
-
-@unwrap_spec(fd=c_int, mode=c_int)
-def fchmod(space, fd, mode):
-    """\
-    Change the access permissions of the file given by file descriptor fd.
-    """
-    _chmod_fd(space, fd, mode)
-
 @unwrap_spec(src_dir_fd=DirFD(rposix.HAVE_RENAMEAT),
         dst_dir_fd=DirFD(rposix.HAVE_RENAMEAT))
 def rename(space, w_src, w_dst, __kwonly__,
@@ -1042,7 +1047,8 @@
         else:
             dispatch_filename_2(rposix.rename)(space, w_src, w_dst)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_filename=w_src, w_filename2=w_dst)
+        raise wrap_oserror2(space, e, w_filename=w_src, w_filename2=w_dst,
+                            eintr_retry=False)
 
 @unwrap_spec(src_dir_fd=DirFD(rposix.HAVE_RENAMEAT),
         dst_dir_fd=DirFD(rposix.HAVE_RENAMEAT))
@@ -1066,7 +1072,8 @@
         else:
             dispatch_filename_2(rposix.replace)(space, w_src, w_dst)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_filename=w_src, w_filename2=w_dst)
+        raise wrap_oserror2(space, e, w_filename=w_src, w_filename2=w_dst,
+                            eintr_retry=False)
 
 @unwrap_spec(mode=c_int, dir_fd=DirFD(rposix.HAVE_MKFIFOAT))
 def mkfifo(space, w_path, mode=0666, __kwonly__=None, dir_fd=DEFAULT_DIR_FD):
@@ -1078,6 +1085,8 @@
   and path should be relative; path will then be relative to that directory.
 dir_fd may not be implemented on your platform.
   If it is unavailable, using it will raise a NotImplementedError."""
+    # CPython 3.5.2: why does os.mkfifo() retry automatically if it
+    # gets EINTR, but not os.mkdir()?
     while True:
         try:
             if rposix.HAVE_MKFIFOAT and dir_fd != DEFAULT_DIR_FD:
@@ -1127,7 +1136,7 @@
     try:
         pid = os.getpid()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(pid)
 
 @unwrap_spec(pid=c_int, signal=c_int)
@@ -1136,7 +1145,7 @@
     try:
         rposix.kill(pid, signal)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(pgid=c_int, signal=c_int)
 def killpg(space, pgid, signal):
@@ -1144,7 +1153,7 @@
     try:
         os.killpg(pgid, signal)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 def abort(space):
     """Abort the interpreter immediately.  This 'dumps core' or otherwise fails
@@ -1182,7 +1191,8 @@
         else:
             rposix.link(src, dst)
     except OSError as e:
-        raise wrap_oserror(space, e, filename=src, filename2=dst)
+        raise wrap_oserror(space, e, filename=src, filename2=dst,
+                           eintr_retry=False)
 
 
 @unwrap_spec(dir_fd=DirFD(rposix.HAVE_SYMLINKAT))
@@ -1209,7 +1219,8 @@
         else:
             dispatch_filename_2(rposix.symlink)(space, w_src, w_dst)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_filename=w_src, w_filename2=w_dst)
+        raise wrap_oserror2(space, e, w_filename=w_src, w_filename2=w_dst,
+                            eintr_retry=False)
 
 
 @unwrap_spec(
@@ -1230,7 +1241,7 @@
         else:
             result = call_rposix(rposix.readlink, path)
     except OSError as e:
-        raise wrap_oserror2(space, e, path.w_path)
+        raise wrap_oserror2(space, e, path.w_path, eintr_retry=False)
     w_result = space.newbytes(result)
     if space.isinstance_w(path.w_path, space.w_unicode):
         return space.fsdecode(w_result)
@@ -1278,7 +1289,7 @@
         except:
             # Don't clobber the OSError if the fork failed
             pass
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     if pid == 0:
         run_fork_hooks('child', space)
     else:
@@ -1296,7 +1307,7 @@
         rposix.set_inheritable(master_fd, False)
         rposix.set_inheritable(slave_fd, False)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newtuple([space.wrap(master_fd), space.wrap(slave_fd)])
 
 def forkpty(space):
@@ -1347,7 +1358,7 @@
     try:
         os.execv(command, args)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 
 def _env2interp(space, w_env):
@@ -1392,12 +1403,12 @@
         try:
             rposix.fexecve(fd, args, env)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
     else:
         try:
             os.execve(path, args, env)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(mode=int, path='fsencode')
 def spawnv(space, mode, path, w_argv):
@@ -1405,7 +1416,7 @@
     try:
         ret = os.spawnv(mode, path, args)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(ret)
 
 @unwrap_spec(mode=int, path='fsencode')
@@ -1415,7 +1426,7 @@
     try:
         ret = os.spawnve(mode, path, args, env)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(ret)
 
 
@@ -1523,7 +1534,7 @@
         #    something is wrong with the file, when it also
         #    could be the time stamp that gives a problem. */
         # so we use wrap_oserror() instead of wrap_oserror2() here
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @specialize.arg(1)
 def do_utimes(space, func, arg, utime):
@@ -1540,7 +1551,7 @@
             func(arg, (atime, mtime))
     except OSError as e:
         # see comment above: don't use wrap_oserror2()
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @specialize.argtype(1)
 def _dispatch_utime(path, times):
@@ -1583,7 +1594,7 @@
     try:
         r = os.uname()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     l_w = [space.wrap_fsdecoded(i)
            for i in [r[0], r[1], r[2], r[3], r[4]]]
     w_tuple = space.newtuple(l_w)
@@ -1607,7 +1618,7 @@
     try:
         os.setuid(uid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(euid=c_uid_t)
 def seteuid(space, euid):
@@ -1618,7 +1629,7 @@
     try:
         os.seteuid(euid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(gid=c_gid_t)
 def setgid(space, gid):
@@ -1629,7 +1640,7 @@
     try:
         os.setgid(gid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(egid=c_gid_t)
 def setegid(space, egid):
@@ -1640,7 +1651,7 @@
     try:
         os.setegid(egid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(path='fsencode')
 def chroot(space, path):
@@ -1651,7 +1662,7 @@
     try:
         os.chroot(path)
     except OSError as e:
-        raise wrap_oserror(space, e, path)
+        raise wrap_oserror(space, e, path, eintr_retry=False)
     return space.w_None
 
 def getgid(space):
@@ -1683,7 +1694,7 @@
     try:
         list = os.getgroups()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newlist([wrap_gid(space, e) for e in list])
 
 def setgroups(space, w_groups):
@@ -1697,7 +1708,7 @@
     try:
         os.setgroups(list[:])
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(username=str, gid=c_gid_t)
 def initgroups(space, username, gid):
@@ -1710,7 +1721,7 @@
     try:
         os.initgroups(username, gid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 def getpgrp(space):
     """ getpgrp() -> pgrp
@@ -1727,7 +1738,7 @@
     try:
         os.setpgrp()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.w_None
 
 def getppid(space):
@@ -1746,7 +1757,7 @@
     try:
         pgid = os.getpgid(pid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(pgid)
 
 @unwrap_spec(pid=c_int, pgrp=c_int)
@@ -1758,7 +1769,7 @@
     try:
         os.setpgid(pid, pgrp)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.w_None
 
 @unwrap_spec(ruid=c_uid_t, euid=c_uid_t)
@@ -1770,7 +1781,7 @@
     try:
         os.setreuid(ruid, euid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(rgid=c_gid_t, egid=c_gid_t)
 def setregid(space, rgid, egid):
@@ -1781,7 +1792,7 @@
     try:
         os.setregid(rgid, egid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(pid=c_int)
 def getsid(space, pid):
@@ -1792,7 +1803,7 @@
     try:
         sid = os.getsid(pid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(sid)
 
 def setsid(space):
@@ -1803,7 +1814,7 @@
     try:
         os.setsid()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.w_None
 
 @unwrap_spec(fd=c_int)
@@ -1815,7 +1826,7 @@
     try:
         pgid = os.tcgetpgrp(fd)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(pgid)
 
 @unwrap_spec(fd=c_int, pgid=c_gid_t)
@@ -1827,7 +1838,7 @@
     try:
         os.tcsetpgrp(fd, pgid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 def getresuid(space):
     """ getresuid() -> (ruid, euid, suid)
@@ -1837,7 +1848,7 @@
     try:
         (ruid, euid, suid) = os.getresuid()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newtuple([wrap_uid(space, ruid),
                            wrap_uid(space, euid),
                            wrap_uid(space, suid)])
@@ -1850,7 +1861,7 @@
     try:
         (rgid, egid, sgid) = os.getresgid()
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newtuple([wrap_gid(space, rgid),
                            wrap_gid(space, egid),
                            wrap_gid(space, sgid)])
@@ -1864,7 +1875,7 @@
     try:
         os.setresuid(ruid, euid, suid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 @unwrap_spec(rgid=c_gid_t, egid=c_gid_t, sgid=c_gid_t)
 def setresgid(space, rgid, egid, sgid):
@@ -1875,7 +1886,7 @@
     try:
         os.setresgid(rgid, egid, sgid)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 def declare_new_w_star(name):
     if name in ('WEXITSTATUS', 'WSTOPSIG', 'WTERMSIG'):
@@ -1901,7 +1912,7 @@
     try:
         return space.wrap_fsdecoded(os.ttyname(fd))
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 
 def confname_w(space, w_name, namespace):
@@ -1920,7 +1931,7 @@
     try:
         res = os.sysconf(num)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(res)
 
 @unwrap_spec(fd=c_int)
@@ -1929,7 +1940,7 @@
     try:
         res = os.fpathconf(fd, num)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(res)
 
 @unwrap_spec(path=path_or_fd(allow_fd=hasattr(os, 'fpathconf')))
@@ -1939,12 +1950,12 @@
         try:
             res = os.fpathconf(path.as_fd, num)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
     else:
         try:
             res = os.pathconf(path.as_bytes, num)
         except OSError as e:
-            raise wrap_oserror2(space, e, path.w_path)
+            raise wrap_oserror2(space, e, path.w_path, eintr_retry=False)
     return space.wrap(res)
 
 def confstr(space, w_name):
@@ -1952,7 +1963,7 @@
     try:
         res = os.confstr(num)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(res)
 
 @unwrap_spec(
@@ -1996,7 +2007,7 @@
         try:
             os.fchown(fd, uid, gid)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
     else:
         # String case
         try:
@@ -2011,7 +2022,7 @@
                 assert dir_fd == DEFAULT_DIR_FD
                 os.chown(path, uid, gid)
         except OSError as e:
-            raise wrap_oserror2(space, e, w_path)
+            raise wrap_oserror2(space, e, w_path, eintr_retry=False)
 
 
 @unwrap_spec(path='fsencode', uid=c_uid_t, gid=c_gid_t)
@@ -2024,7 +2035,7 @@
     try:
         os.lchown(path, uid, gid)
     except OSError as e:
-        raise wrap_oserror(space, e, path)
+        raise wrap_oserror(space, e, path, eintr_retry=False)
 
 @unwrap_spec(uid=c_uid_t, gid=c_gid_t)
 def fchown(space, w_fd, uid, gid):
@@ -2032,6 +2043,7 @@
 
 Change the owner and group id of the file given by file descriptor
 fd to the numeric uid and gid.  Equivalent to os.chown(fd, uid, gid)."""
+    # same comment than about os.chmod(fd) vs. os.fchmod(fd)
     fd = space.c_filedescriptor_w(w_fd)
     while True:
         try:
@@ -2071,7 +2083,7 @@
     try:
         res = os.nice(increment)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.wrap(res)
 
 @unwrap_spec(size=int)
@@ -2084,7 +2096,9 @@
     try:
         return space.newbytes(rurandom.urandom(context, size))
     except OSError as e:
-        raise wrap_oserror(space, e)
+        # 'rurandom' should catch and retry internally if it gets EINTR
+        # (at least in os.read(), which is probably enough in practice)
+        raise wrap_oserror(space, e, eintr_retry=False)
 
 def ctermid(space):
     """ctermid() -> string
@@ -2122,7 +2136,7 @@
         try:
             info = nt._getfileinformation(fd)
         except OSError as e:
-            raise wrap_oserror(space, e)
+            raise wrap_oserror(space, e, eintr_retry=False)
         return space.newtuple([space.wrap(info[0]),
                                space.wrap(info[1]),
                                space.wrap(info[2])])
@@ -2135,7 +2149,7 @@
             raise OperationError(space.w_NotImplementedError,
                                  space.wrap(e.msg))
         except OSError as e:
-            raise wrap_oserror2(space, e, w_path)
+            raise wrap_oserror2(space, e, w_path, eintr_retry=False)
         return space.wrap(result)
 
 
@@ -2267,7 +2281,7 @@
     try:
         flags = rposix.get_status_flags(fd)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
     return space.newbool(flags & rposix.O_NONBLOCK == 0)
 
 @unwrap_spec(fd=c_int, blocking=int)
@@ -2280,4 +2294,4 @@
             flags |= rposix.O_NONBLOCK
         rposix.set_status_flags(fd, flags)
     except OSError as e:
-        raise wrap_oserror(space, e)
+        raise wrap_oserror(space, e, eintr_retry=False)
diff --git a/pypy/module/posix/interp_scandir.py 
b/pypy/module/posix/interp_scandir.py
--- a/pypy/module/posix/interp_scandir.py
+++ b/pypy/module/posix/interp_scandir.py
@@ -28,7 +28,7 @@
     try:
         dirp = rposix_scandir.opendir(path_bytes)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, w_path, eintr_retry=False)
     path_prefix = path_bytes
     if len(path_prefix) > 0 and path_prefix[-1] != '/':
         path_prefix += '/'
@@ -85,7 +85,8 @@
                 try:
                     entry = rposix_scandir.nextentry(self.dirp)
                 except OSError as e:
-                    raise self.fail(wrap_oserror2(space, e, 
self.w_path_prefix))
+                    raise self.fail(wrap_oserror2(space, e, self.w_path_prefix,
+                                                  eintr_retry=False))
                 if not entry:
                     raise self.fail()
                 assert rposix_scandir.has_name_bytes(entry)
@@ -235,7 +236,8 @@
         except OSError as e:
             if e.errno == ENOENT:    # not found
                 return -1
-            raise wrap_oserror2(self.space, e, self.fget_path(self.space))
+            raise wrap_oserror2(self.space, e, self.fget_path(self.space),
+                                eintr_retry=False)
         return stat.S_IFMT(st.st_mode)
 
     def is_dir(self, follow_symlinks):
@@ -287,7 +289,8 @@
         try:
             st = self.get_stat_or_lstat(follow_symlinks)
         except OSError as e:
-            raise wrap_oserror2(space, e, self.fget_path(space))
+            raise wrap_oserror2(space, e, self.fget_path(space),
+                                eintr_retry=False)
         return build_stat_result(space, st)
 
     def descr_inode(self, space):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to