Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r78953:6bfa818c8cce Date: 2015-08-12 19:34 +0200 http://bitbucket.org/pypy/pypy/changeset/6bfa818c8cce/
Log: (fijal, arigo) try to make vmprof C interface init a bit more lazy diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py --- a/rpython/rlib/rvmprof/cintf.py +++ b/rpython/rlib/rvmprof/cintf.py @@ -6,54 +6,69 @@ from rpython.rtyper.tool import rffi_platform as platform from rpython.jit.backend import detect_cpu -if not detect_cpu.autodetect().startswith(detect_cpu.MODEL_X86_64): - py.test.skip("rvmprof only supports x86-64 CPUs for now") +class VMProfPlatformUnsupported(Exception): + pass -ROOT = py.path.local(__file__).join('..') -SRC = ROOT.join('src') +def setup(): + if not detect_cpu.autodetect().startswith(detect_cpu.MODEL_X86_64): + raise VMProfPlatformUnsupported("rvmprof only supports" + " x86-64 CPUs for now") -if sys.platform.startswith('linux'): - libs = ['dl'] -else: - libs = [] + ROOT = py.path.local(__file__).join('..') + SRC = ROOT.join('src') -eci_kwds = dict( - include_dirs = [SRC], - includes = ['rvmprof.h'], - libraries = libs, - separate_module_files = [SRC.join('rvmprof.c')], - post_include_bits=['#define RPYTHON_VMPROF\n'], - ) -eci = ExternalCompilationInfo(**eci_kwds) -platform.verify_eci(ExternalCompilationInfo( - compile_extra=['-DRPYTHON_LL2CTYPES'], - **eci_kwds)) + if sys.platform.startswith('linux'): + libs = ['dl'] + else: + libs = [] + eci_kwds = dict( + include_dirs = [SRC], + includes = ['rvmprof.h'], + libraries = libs, + separate_module_files = [SRC.join('rvmprof.c')], + post_include_bits=['#define RPYTHON_VMPROF\n'], + ) + eci = ExternalCompilationInfo(**eci_kwds) -vmprof_init = rffi.llexternal("rpython_vmprof_init", [rffi.INT], rffi.CCHARP, - compilation_info=eci) -vmprof_enable = rffi.llexternal("rpython_vmprof_enable", [rffi.LONG], rffi.INT, - compilation_info=eci, - save_err=rffi.RFFI_SAVE_ERRNO) -vmprof_disable = rffi.llexternal("rpython_vmprof_disable", [], rffi.INT, - compilation_info=eci, - save_err=rffi.RFFI_SAVE_ERRNO) -vmprof_write_buf = rffi.llexternal("rpython_vmprof_write_buf", - [rffi.CCHARP, rffi.LONG], - lltype.Void, compilation_info=eci) + platform.verify_eci(ExternalCompilationInfo( + compile_extra=['-DRPYTHON_LL2CTYPES'], + **eci_kwds)) -## vmprof_register_virtual_function = rffi.llexternal( -## "vmprof_register_virtual_function", -## [rffi.CCHARP, rffi.VOIDP, rffi.VOIDP], lltype.Void, -## compilation_info=eci, _nowrapper=True) -vmprof_ignore_signals = rffi.llexternal("rpython_vmprof_ignore_signals", - [rffi.INT], lltype.Void, - compilation_info=eci) + vmprof_init = rffi.llexternal("rpython_vmprof_init", [rffi.INT], rffi.CCHARP, + compilation_info=eci) + vmprof_enable = rffi.llexternal("rpython_vmprof_enable", [rffi.LONG], rffi.INT, + compilation_info=eci, + save_err=rffi.RFFI_SAVE_ERRNO) + vmprof_disable = rffi.llexternal("rpython_vmprof_disable", [], rffi.INT, + compilation_info=eci, + save_err=rffi.RFFI_SAVE_ERRNO) + vmprof_write_buf = rffi.llexternal("rpython_vmprof_write_buf", + [rffi.CCHARP, rffi.LONG], + lltype.Void, compilation_info=eci) + ## vmprof_register_virtual_function = rffi.llexternal( + ## "vmprof_register_virtual_function", + ## [rffi.CCHARP, rffi.VOIDP, rffi.VOIDP], lltype.Void, + ## compilation_info=eci, _nowrapper=True) + + vmprof_ignore_signals = rffi.llexternal("rpython_vmprof_ignore_signals", + [rffi.INT], lltype.Void, + compilation_info=eci) + return CInterface(locals()) + + +class CInterface(object): + def __init__(self, namespace): + for k, v in namespace.iteritems(): + setattr(self, k, v) + + def _freeze_(self): + return True def token2lltype(tok): if tok == 'i': diff --git a/rpython/rlib/rvmprof/rvmprof.py b/rpython/rlib/rvmprof/rvmprof.py --- a/rpython/rlib/rvmprof/rvmprof.py +++ b/rpython/rlib/rvmprof/rvmprof.py @@ -19,7 +19,6 @@ def __str__(self): return self.msg - class VMProf(object): def __init__(self): @@ -31,6 +30,7 @@ self._code_unique_id = 0 # XXX this is wrong, it won't work on 32bit else: self._code_unique_id = 0x7000000000000000 + self.cintf = cintf.setup() def _cleanup_(self): self.is_enabled = False @@ -106,14 +106,14 @@ raise VMProfError("bad value for 'interval'") interval_usec = int(interval * 1000000.0) - p_error = cintf.vmprof_init(fileno) + p_error = self.cintf.vmprof_init(fileno) if p_error: raise VMProfError(rffi.charp2str(p_error)) self.fileno = fileno self._write_header(interval_usec) self._gather_all_code_objs() - res = cintf.vmprof_enable(interval_usec) + res = self.cintf.vmprof_enable(interval_usec) if res < 0: raise VMProfError(os.strerror(rposix.get_saved_errno())) self.is_enabled = True @@ -128,7 +128,7 @@ if self._current_codes is not None: self._flush_codes() self.fileno = -1 - res = cintf.vmprof_disable() + res = self.cintf.vmprof_disable() if res < 0: raise VMProfError(os.strerror(rposix.get_saved_errno())) @@ -149,7 +149,7 @@ def _flush_codes(self): buf = self._current_codes.build() self._current_codes = None - cintf.vmprof_write_buf(buf, len(buf)) + self.cintf.vmprof_write_buf(buf, len(buf)) # NOTE: keep in mind that vmprof_write_buf() can only write # a maximum of 8184 bytes. This should be guaranteed here because: assert MAX_CODES + 17 + MAX_FUNC_NAME <= 8184 @@ -165,7 +165,7 @@ b.append(chr(len('pypy'))) b.append('pypy') buf = b.build() - cintf.vmprof_write_buf(buf, len(buf)) + self.cintf.vmprof_write_buf(buf, len(buf)) def _write_long_to_string_builder(l, b): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit