[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