[pypy-svn] r79938 - in pypy/trunk/pypy: module/posix module/posix/test rpython/module translator/c/test
arigo at codespeak.net
arigo at codespeak.net
Thu Dec 9 18:30:35 CET 2010
Author: arigo
Date: Thu Dec 9 18:30:33 2010
New Revision: 79938
Modified:
pypy/trunk/pypy/module/posix/__init__.py
pypy/trunk/pypy/module/posix/interp_posix.py
pypy/trunk/pypy/module/posix/test/test_posix2.py
pypy/trunk/pypy/rpython/module/ll_os.py
pypy/trunk/pypy/translator/c/test/test_extfunc.py
Log:
Implement os.getloadavg(). (Phew, we really need to edit files in all
corners of the world for this...)
Modified: pypy/trunk/pypy/module/posix/__init__.py
==============================================================================
--- pypy/trunk/pypy/module/posix/__init__.py (original)
+++ pypy/trunk/pypy/module/posix/__init__.py Thu Dec 9 18:30:33 2010
@@ -111,6 +111,8 @@
interpleveldefs['sysconf_names'] = 'space.wrap(os.sysconf_names)'
if hasattr(os, 'ttyname'):
interpleveldefs['ttyname'] = 'interp_posix.ttyname'
+ if hasattr(os, 'getloadavg'):
+ interpleveldefs['getloadavg'] = 'interp_posix.getloadavg'
for name in ['setsid', 'getuid', 'geteuid', 'getgid', 'getegid', 'setuid',
'seteuid', 'setgid', 'setegid', 'getpgrp', 'setpgrp',
Modified: pypy/trunk/pypy/module/posix/interp_posix.py
==============================================================================
--- pypy/trunk/pypy/module/posix/interp_posix.py (original)
+++ pypy/trunk/pypy/module/posix/interp_posix.py Thu Dec 9 18:30:33 2010
@@ -963,6 +963,17 @@
return space.w_None
chown.unwrap_spec = [ObjSpace, str, "c_nonnegint", "c_nonnegint"]
+def getloadavg(space):
+ try:
+ load = os.getloadavg()
+ except OSError, e:
+ raise OperationError(space.w_OSError,
+ space.wrap("Load averages are unobtainable"))
+ return space.newtuple([space.wrap(load[0]),
+ space.wrap(load[1]),
+ space.wrap(load[2])])
+getloadavg.unwrap_spec = [ObjSpace]
+
if _WIN:
from pypy.rlib import rwin32
Modified: pypy/trunk/pypy/module/posix/test/test_posix2.py
==============================================================================
--- pypy/trunk/pypy/module/posix/test/test_posix2.py (original)
+++ pypy/trunk/pypy/module/posix/test/test_posix2.py Thu Dec 9 18:30:33 2010
@@ -521,6 +521,14 @@
assert os.WIFEXITED(status)
assert os.WEXITSTATUS(status) == exit_status
+ if hasattr(os, 'getloadavg'):
+ def test_os_getloadavg(self):
+ os = self.posix
+ l0, l1, l2 = os.getloadavg()
+ assert type(l0) is float and l0 >= 0.0
+ assert type(l1) is float and l0 >= 0.0
+ assert type(l2) is float and l0 >= 0.0
+
if hasattr(os, 'fsync'):
def test_fsync(self):
os = self.posix
Modified: pypy/trunk/pypy/rpython/module/ll_os.py
==============================================================================
--- pypy/trunk/pypy/rpython/module/ll_os.py (original)
+++ pypy/trunk/pypy/rpython/module/ll_os.py Thu Dec 9 18:30:33 2010
@@ -730,6 +730,22 @@
return extdef([traits.str, int, int], int, traits.ll_os_name('open'),
llimpl=os_open_llimpl, oofakeimpl=os_open_oofakeimpl)
+ @registering_if(os, 'getloadavg')
+ def register_os_getloadavg(self):
+ AP = rffi.CArrayPtr(lltype.Float)
+ c_getloadavg = self.llexternal('getloadavg', [AP, rffi.INT], rffi.INT)
+
+ def getloadavg_llimpl():
+ load = lltype.malloc(AP.TO, 3, flavor='raw')
+ r = c_getloadavg(load, 3)
+ result_tuple = load[0], load[1], load[2]
+ lltype.free(load, flavor='raw')
+ if r != 3:
+ raise OSError
+ return result_tuple
+ return extdef([], (float, float, float),
+ "ll_os.ll_getloadavg", llimpl=getloadavg_llimpl)
+
# ------------------------------- os.read -------------------------------
@registering(os.read)
Modified: pypy/trunk/pypy/translator/c/test/test_extfunc.py
==============================================================================
--- pypy/trunk/pypy/translator/c/test/test_extfunc.py (original)
+++ pypy/trunk/pypy/translator/c/test/test_extfunc.py Thu Dec 9 18:30:33 2010
@@ -755,3 +755,13 @@
for i in range(5):
res = func(i)
assert res == os.uname()[i]
+
+if hasattr(os, 'getloadavg'):
+ def test_os_getloadavg():
+ def does_stuff():
+ a, b, c = os.getloadavg()
+ print a, b, c
+ return a + b + c
+ f = compile(does_stuff, [])
+ res = f()
+ assert type(res) is float and res >= 0.0
More information about the Pypy-commit
mailing list