Author: Armin Rigo <[email protected]>
Branch:
Changeset: r75266:276ba3e27516
Date: 2015-01-09 01:01 +0100
http://bitbucket.org/pypy/pypy/changeset/276ba3e27516/
Log: Issue #1956
Follow-up on 9ff421c20db5: on systems that have clock_gettime(),
reimplement the RPython clock() based on it. This is in line with
"man clock" on Linux, and should be guaranteed to give more precise
results.
diff --git a/rpython/rtyper/module/ll_time.py b/rpython/rtyper/module/ll_time.py
--- a/rpython/rtyper/module/ll_time.py
+++ b/rpython/rtyper/module/ll_time.py
@@ -47,6 +47,8 @@
if sys.platform.startswith('freebsd') or sys.platform.startswith('netbsd'):
libraries = ['compat']
+elif sys.platform == 'linux2':
+ libraries = ['rt']
else:
libraries = []
@@ -58,7 +60,15 @@
TIMEB = platform.Struct(STRUCT_TIMEB, [('time', rffi.INT),
('millitm', rffi.INT)])
-constant_names = ['RUSAGE_SELF', 'EINTR']
+class CConfigForClockGetTime:
+ _compilation_info_ = ExternalCompilationInfo(
+ includes=['time.h'],
+ libraries=libraries
+ )
+ TIMESPEC = platform.Struct('struct timespec', [('tv_sec', rffi.LONG),
+ ('tv_nsec', rffi.LONG)])
+
+constant_names = ['RUSAGE_SELF', 'EINTR', 'CLOCK_PROCESS_CPUTIME_ID']
for const in constant_names:
setattr(CConfig, const, platform.DefinedConstantInteger(const))
defs_names = ['GETTIMEOFDAY_NO_TZ']
@@ -162,6 +172,21 @@
diff = a[0] - state.counter_start
lltype.free(a, flavor='raw')
return float(diff) / state.divisor
+ elif self.CLOCK_PROCESS_CPUTIME_ID is not None:
+ # Linux and other POSIX systems with clock_gettime()
+ self.configure(CConfigForClockGetTime)
+ TIMESPEC = self.TIMESPEC
+ CLOCK_PROCESS_CPUTIME_ID = self.CLOCK_PROCESS_CPUTIME_ID
+ c_clock_gettime = self.llexternal('clock_gettime',
+ [lltype.Signed, lltype.Ptr(TIMESPEC)],
+ rffi.INT, releasegil=False)
+ def time_clock_llimpl():
+ a = lltype.malloc(TIMESPEC, flavor='raw')
+ c_clock_gettime(CLOCK_PROCESS_CPUTIME_ID, a)
+ result = (float(rffi.getintfield(a, 'c_tv_sec')) +
+ float(rffi.getintfield(a, 'c_tv_nsec')) *
0.000000001)
+ lltype.free(a, flavor='raw')
+ return result
else:
RUSAGE = self.RUSAGE
RUSAGE_SELF = self.RUSAGE_SELF or 0
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit