[pypy-commit] pypy more-rposix: Port *pid() and *pgrp() functions

amauryfa noreply at buildbot.pypy.org
Fri Nov 7 14:52:25 CET 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: more-rposix
Changeset: r74369:ece292fe78e1
Date: 2014-11-07 09:12 +0100
http://bitbucket.org/pypy/pypy/changeset/ece292fe78e1/

Log:	Port *pid() and *pgrp() functions

diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -159,6 +159,9 @@
                            ('tms_cutime', rffi.INT),
                            ('tms_cstime', rffi.INT)])
 
+    GETPGRP_HAVE_ARG = rffi_platform.Has("getpgrp(0)")
+    SETPGRP_HAVE_ARG = rffi_platform.Has("setpgrp(0, 0)")
+
 config = rffi_platform.configure(CConfig)
 globals().update(config)
 
@@ -586,8 +589,105 @@
 
 #___________________________________________________________________
 
+c_getpid = external('getpid', [], rffi.PID_T, releasegil=False)
+c_getppid = external('getppid', [], rffi.PID_T, releasegil=False)
 c_setsid = external('setsid', [], rffi.PID_T)
 c_getsid = external('getsid', [rffi.PID_T], rffi.PID_T)
+
+ at replace_os_function('getpid')
+def getpid():
+    return intmask(c_getpid())
+
+ at replace_os_function('getppid')
+def getppid():
+    return intmask(c_getppid())
+
+ at replace_os_function('setsid')
+def setsid():
+    return handle_posix_error('setsid', c_setsid())
+
+ at replace_os_function('getsid')
+def getsid(pid):
+    return handle_posix_error('getsid', c_getsid(pid))
+
+c_getpgid = external('getpid', [rffi.PID_T], rffi.PID_T)
+c_setpgid = external('setpid', [rffi.PID_T, rffi.PID_T], rffi.INT)
+
+ at replace_os_function('getpgid')
+def getpgid(pid):
+    return handle_posix_error('getpgid', c_getpgid(pid))
+
+ at replace_os_function('setpgid')
+def setpgid(pid, gid):
+    handle_posix_error('setpgid', c_setpgid(pid, gid))
+
+PID_GROUPS_T = rffi.CArrayPtr(rffi.PID_T)
+c_getgroups = external('getgroups', [rffi.INT, PID_GROUPS_T], rffi.INT)
+c_setgroups = external('setgroups', [rffi.SIZE_T, PID_GROUPS_T], rffi.INT)
+c_initgroups = external('initgroups', [rffi.CCHARP, rffi.PID_T], rffi.INT)
+
+ at replace_os_function('getgroups')
+def getgroups():
+    n = handle_posix_error('getgroups',
+                           c_getgroups(0, lltype.nullptr(PID_GROUPS_T.TO)))
+    groups = lltype.malloc(PID_GROUPS_T.TO, n, flavor='raw')
+    try:
+        n = handle_posix_error('getgroups', c_getgroups(n, groups))
+        return [intmask(groups[i]) for i in range(n)]
+    finally:
+        lltype.free(groups, flavor='raw')
+
+ at replace_os_function('setgroups')
+def setgroups(gids):
+    n = len(gids)
+    groups = lltype.malloc(PID_GROUPS_T.TO, n, flavor='raw')
+    try:
+        for i in range(n):
+            groups[i] = rffi.cast(rffi.PID_T, gids[i])
+        handle_posix_error('setgroups', c_setgroups(n, groups))
+    finally:
+        lltype.free(groups, flavor='raw')
+
+ at replace_os_function('initgroups')
+def initgroups(user, group):
+    handle_posix_error('initgroups', c_initgroups(user, group))
+
+if GETPGRP_HAVE_ARG:
+    c_getpgrp = external('getpgrp', [rffi.INT], rffi.INT)
+else:
+    c_getpgrp = external('getpgrp', [], rffi.INT)
+if SETPGRP_HAVE_ARG:
+    c_setpgrp = external('setpgrp', [rffi.INT, rffi.INT], rffi.INT)
+else:
+    c_setpgrp = external('setpgrp', [], rffi.INT)
+
+ at replace_os_function('getpgrp')
+def getpgrp():
+    if GETPGRP_HAVE_ARG:
+        return handle_posix_error('getpgrp', c_getpgrp(0))
+    else:
+        return handle_posix_error('getpgrp', c_getpgrp())
+
+ at replace_os_function('setpgrp')
+def setpgrp():
+    if SETPGRP_HAVE_ARG:
+        return handle_posix_error('setpgrp', c_setpgrp(0, 0))
+    else:
+        return handle_posix_error('setpgrp', c_setpgrp())
+
+c_tcgetpgrp = external('tcgetpgrp', [rffi.INT], rffi.PID_T)
+c_tcsetpgrp = external('tcsetpgrp', [rffi.INT, rffi.PID_T], rffi.INT)
+
+ at replace_os_function('tcgetpgrp')
+def tcgetpgrp(fd):
+    return handle_posix_error('tcgetpgrp', c_tcgetpgrp(fd))
+
+ at replace_os_function('tcsetpgrp')
+def tcsetpgrp(fd, pgrp):
+    return handle_posix_error('tcsetpgrp', c_tcsetpgrp(fd, pgrp))
+
+#___________________________________________________________________
+
 c_getuid = external('getuid', [], rffi.INT)
 c_geteuid = external('geteuid', [], rffi.INT)
 c_setuid = external('setuid', [rffi.INT], rffi.INT)
@@ -597,14 +697,6 @@
 c_setgid = external('setgid', [rffi.INT], rffi.INT)
 c_setegid = external('setegid', [rffi.INT], rffi.INT)
 
- at replace_os_function('setsid')
-def setsid():
-    return handle_posix_error('setsid', c_setsid())
-
- at replace_os_function('getsid')
-def getsid(pid):
-    return handle_posix_error('getsid', c_getsid(pid))
-
 @replace_os_function('getuid')
 def getuid():
     return handle_posix_error('getuid', c_getuid())
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -149,18 +149,6 @@
         if not _WIN32:
             assert self.OFF_T_SIZE == rffi.sizeof(rffi.LONGLONG)
 
-        if hasattr(os, 'getpgrp'):
-            self.GETPGRP_HAVE_ARG = platform.checkcompiles(
-                "getpgrp(0)",
-                '#include <unistd.h>',
-                [])
-
-        if hasattr(os, 'setpgrp'):
-            self.SETPGRP_HAVE_ARG = platform.checkcompiles(
-                "setpgrp(0,0)",
-                '#include <unistd.h>',
-                [])
-
         # we need an indirection via c functions to get macro calls working on llvm XXX still?
         if hasattr(os, 'WCOREDUMP'):
             decl_snippet = """
@@ -365,141 +353,6 @@
         return extdef([int], SomeString(can_be_None=True),
                       "ll_os.ll_confstr", llimpl=confstr_llimpl)
 
-    @registering_if(os, 'getpid')
-    def register_os_getpid(self):
-        return self.extdef_for_os_function_returning_int('getpid', releasegil=False)
-
-    @registering_if(os, 'getgroups')
-    def register_os_getgroups(self):
-        GP = rffi.CArrayPtr(rffi.PID_T)
-        c_getgroups = self.llexternal('getgroups', [rffi.INT, GP], rffi.INT)
-
-        def getgroups_llimpl():
-            n = c_getgroups(0, lltype.nullptr(GP.TO))
-            if n >= 0:
-                groups = lltype.malloc(GP.TO, n, flavor='raw')
-                try:
-                    n = c_getgroups(n, groups)
-                    result = [rffi.cast(lltype.Signed, groups[i])
-                              for i in range(n)]
-                finally:
-                    lltype.free(groups, flavor='raw')
-                if n >= 0:
-                    return result
-            raise OSError(rposix.get_errno(), "os_getgroups failed")
-
-        return extdef([], [int], llimpl=getgroups_llimpl,
-                      export_name="ll_os.ll_getgroups")
-
-    @registering_if(os, 'setgroups')
-    def register_os_setgroups(self):
-        GP = rffi.CArrayPtr(rffi.PID_T)
-        c_setgroups = self.llexternal('setgroups', [rffi.SIZE_T, GP], rffi.INT)
-
-        def setgroups_llimpl(list):
-            n = len(list)
-            groups = lltype.malloc(GP.TO, n, flavor='raw')
-            try:
-                for i in range(n):
-                    groups[i] = rffi.cast(rffi.PID_T, list[i])
-                n = c_setgroups(rffi.cast(rffi.SIZE_T, n), groups)
-            finally:
-                lltype.free(groups, flavor='raw')
-            if n != 0:
-                raise OSError(rposix.get_errno(), "os_setgroups failed")
-
-        return extdef([[int]], None, llimpl=setgroups_llimpl,
-                      export_name="ll_os.ll_setgroups")
-
-    @registering_if(os, 'initgroups')
-    def register_os_initgroups(self):
-        c_initgroups = self.llexternal('initgroups',
-                                       [rffi.CCHARP, rffi.PID_T], rffi.INT)
-
-        def initgroups_llimpl(user, group):
-            n = c_initgroups(user, rffi.cast(rffi.PID_T, group))
-            if n != 0:
-                raise OSError(rposix.get_errno(), "os_initgroups failed")
-
-        return extdef([str, int], None, llimpl=initgroups_llimpl,
-                      export_name="ll_os.ll_initgroups")
-
-    @registering_if(os, 'getpgrp')
-    def register_os_getpgrp(self):
-        name = 'getpgrp'
-        if self.GETPGRP_HAVE_ARG:
-            c_func = self.llexternal(name, [rffi.INT], rffi.INT)
-            def c_func_llimpl():
-                res = rffi.cast(rffi.SIGNED, c_func(0))
-                if res == -1:
-                    raise OSError(rposix.get_errno(), "%s failed" % name)
-                return res
-
-            c_func_llimpl.func_name = name + '_llimpl'
-
-            return extdef([], int, llimpl=c_func_llimpl,
-                          export_name='ll_os.ll_os_' + name)
-        else:
-            return self.extdef_for_os_function_returning_int('getpgrp')
-
-    @registering_if(os, 'setpgrp')
-    def register_os_setpgrp(self):
-        name = 'setpgrp'
-        if self.SETPGRP_HAVE_ARG:
-            c_func = self.llexternal(name, [rffi.INT, rffi.INT], rffi.INT)
-            def c_func_llimpl():
-                res = rffi.cast(rffi.SIGNED, c_func(0, 0))
-                if res == -1:
-                    raise OSError(rposix.get_errno(), "%s failed" % name)
-
-            c_func_llimpl.func_name = name + '_llimpl'
-
-            return extdef([], None, llimpl=c_func_llimpl,
-                          export_name='ll_os.ll_os_' + name)
-        else:
-            return self.extdef_for_os_function_accepting_0int(name)
-
-    @registering_if(os, 'tcgetpgrp')
-    def register_os_tcgetpgrp(self):
-        c_tcgetpgrp = self.llexternal('tcgetpgrp', [rffi.INT], rffi.PID_T)
-
-        def c_tcgetpgrp_llimpl(fd):
-            res = c_tcgetpgrp(rffi.cast(rffi.INT, fd))
-            res = rffi.cast(lltype.Signed, res)
-            if res == -1:
-                raise OSError(rposix.get_errno(), "tcgetpgrp failed")
-            return res
-
-        return extdef([int], int, llimpl=c_tcgetpgrp_llimpl,
-                      export_name='ll_os.ll_os_tcgetpgrp')
-
-    @registering_if(os, 'tcsetpgrp')
-    def register_os_tcsetpgrp(self):
-        c_tcsetpgrp = self.llexternal('tcsetpgrp', [rffi.INT, rffi.PID_T],
-                                      rffi.INT)
-
-        def c_tcsetpgrp_llimpl(fd, pgrp):
-            res = c_tcsetpgrp(rffi.cast(rffi.INT, fd),
-                              rffi.cast(rffi.PID_T, pgrp))
-            res = rffi.cast(lltype.Signed, res)
-            if res == -1:
-                raise OSError(rposix.get_errno(), "tcsetpgrp failed")
-
-        return extdef([int, int], None, llimpl=c_tcsetpgrp_llimpl,
-                      export_name='ll_os.ll_os_tcsetpgrp')
-
-    @registering_if(os, 'getppid')
-    def register_os_getppid(self):
-        return self.extdef_for_os_function_returning_int('getppid')
-
-    @registering_if(os, 'getpgid')
-    def register_os_getpgid(self):
-        return self.extdef_for_os_function_int_to_int('getpgid')
-
-    @registering_if(os, 'setpgid')
-    def register_os_setpgid(self):
-        return self.extdef_for_os_function_accepting_2int('setpgid')
-
     @registering_if(os, 'getloadavg')
     def register_os_getloadavg(self):
         AP = rffi.CArrayPtr(lltype.Float)


More information about the pypy-commit mailing list