[pypy-svn] pypy default: Adding os.wait3 to the standard library

Guillebert Romain commits-noreply at bitbucket.org
Thu Mar 31 18:43:15 CEST 2011


Author: Guillebert Romain <romain.py at gmail.com>
Branch: 
Changeset: r43061:18400e48e571
Date: 2011-03-31 17:42 +0100
http://bitbucket.org/pypy/pypy/changeset/18400e48e571/

Log:	Adding os.wait3 to the standard library

diff --git a/lib_pypy/_pypy_wait.py b/lib_pypy/_pypy_wait.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_pypy_wait.py
@@ -0,0 +1,35 @@
+from ctypes import CDLL, c_int, POINTER, byref
+from ctypes.util import find_library
+from resource import _struct_rusage, struct_rusage
+
+libc = CDLL(find_library("c"))
+wait3 = libc.wait3
+
+wait3.argtypes = [POINTER(c_int), c_int, POINTER(_struct_rusage)]
+
+def wait3(options):
+    status = c_int()
+    _rusage = _struct_rusage()
+    pid = wait3(byref(status), c_int(options), byref(_rusage))
+
+    rusage = struct_rusage((
+        float(_rusage.ru_utime),
+        float(_rusage.ru_stime),
+        _rusage.ru_maxrss,
+        _rusage.ru_ixrss,
+        _rusage.ru_idrss,
+        _rusage.ru_isrss,
+        _rusage.ru_minflt,
+        _rusage.ru_majflt,
+        _rusage.ru_nswap,
+        _rusage.ru_inblock,
+        _rusage.ru_oublock,
+        _rusage.ru_msgsnd,
+        _rusage.ru_msgrcv,
+        _rusage.ru_nsignals,
+        _rusage.ru_nvcsw,
+        _rusage.ru_nivcsw))
+
+    return pid, status.value, rusage
+
+__all__ = ["wait3"]

diff --git a/pypy/module/posix/app_posix.py b/pypy/module/posix/app_posix.py
--- a/pypy/module/posix/app_posix.py
+++ b/pypy/module/posix/app_posix.py
@@ -195,6 +195,14 @@
         """
         return posix.waitpid(-1, 0)
 
+    def wait3(options):
+        """ wait3() -> (pid, status, rusage)
+
+        Wait for completion of a child process and provides resource usage informations
+        """
+        from _pypy_wait import wait3
+        return wait3(options)
+
 else:
     # Windows implementations
     

diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -31,6 +31,8 @@
 
     if hasattr(os, 'wait'):
         appleveldefs['wait'] = 'app_posix.wait'
+    if hasattr(os, 'wait3'):
+        appleveldefs['wait3'] = 'app_posix.wait3'
         
     interpleveldefs = {
     'open'      : 'interp_posix.open',

diff --git a/lib_pypy/pypy_test/test_os_wait3.py b/lib_pypy/pypy_test/test_os_wait3.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/pypy_test/test_os_wait3.py
@@ -0,0 +1,19 @@
+import os
+
+if hasattr(os, 'wait3'):
+    def test_os_wait3():
+        exit_status = 0x33
+
+        if not hasattr(os, "fork"):
+            skip("Need fork() to test wait3()")
+
+        child = os.fork()
+        if child == 0: # in child
+            os._exit(exit_status)
+        else:
+            pid, status, rusage = os.wait3(0)
+            assert child == pid
+            assert os.WIFEXITED(status)
+            assert os.WEXITSTATUS(status) == exit_status
+            assert isinstance(rusage.ru_utime, float)
+            assert isinstance(rusage.ru_maxrss, int)


More information about the Pypy-commit mailing list