[pypy-commit] pypy improve-vmprof-testing: Tentative proper fix for stacklet+vmprof
arigo
pypy.commits at gmail.com
Mon Aug 8 13:56:21 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: improve-vmprof-testing
Changeset: r86092:68cb0f468f13
Date: 2016-08-08 19:55 +0200
http://bitbucket.org/pypy/pypy/changeset/68cb0f468f13/
Log: Tentative proper fix for stacklet+vmprof
diff --git a/rpython/rlib/rstacklet.py b/rpython/rlib/rstacklet.py
--- a/rpython/rlib/rstacklet.py
+++ b/rpython/rlib/rstacklet.py
@@ -3,6 +3,7 @@
from rpython.rlib import jit
from rpython.rlib.objectmodel import fetch_translated_config
from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.rlib.rvmprof import cintf
DEBUG = False
@@ -24,7 +25,12 @@
def new(self, callback, arg=llmemory.NULL):
if DEBUG:
callback = _debug_wrapper(callback)
- h = self._gcrootfinder.new(self, callback, arg)
+ x = cintf.save_rvmprof_stack()
+ try:
+ cintf.empty_rvmprof_stack()
+ h = self._gcrootfinder.new(self, callback, arg)
+ finally:
+ cintf.restore_rvmprof_stack(x)
if DEBUG:
debug.add(h)
return h
@@ -34,7 +40,11 @@
def switch(self, stacklet):
if DEBUG:
debug.remove(stacklet)
- h = self._gcrootfinder.switch(stacklet)
+ x = cintf.save_rvmprof_stack()
+ try:
+ h = self._gcrootfinder.switch(stacklet)
+ finally:
+ cintf.restore_rvmprof_stack(x)
if DEBUG:
debug.add(h)
return h
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
@@ -98,9 +98,6 @@
def leave_code(s):
if not we_are_translated():
- # xxx this assertion may be false in the presence of
- # stacklets, but let's assume we never run untranslated
- # tests with stacklets and rvmprof
assert vmprof_tl_stack.getraw() == s
vmprof_tl_stack.setraw(s.c_next)
lltype.free(s, flavor='raw')
@@ -143,9 +140,17 @@
enter_code(unique_id) # ignore the return value
else:
s = vmprof_tl_stack.getraw()
- #assert s.c_value == unique_id and s.c_kind == VMPROF_CODE_TAG
- #^^^ this is false in the presence of stacklets.
- # we get random nonsense then; let's say it's ok for now
- # and avoid crashing.
- if s.c_value == unique_id and s.c_kind == VMPROF_CODE_TAG:
- leave_code(s)
+ assert s.c_value == unique_id and s.c_kind == VMPROF_CODE_TAG
+ leave_code(s)
+
+#
+# stacklet support
+
+def save_rvmprof_stack():
+ return vmprof_tl_stack.get_or_make_raw()
+
+def empty_rvmprof_stack():
+ vmprof_tl_stack.setraw(lltype.nullptr(VMPROFSTACK))
+
+def restore_rvmprof_stack(x):
+ vmprof_tl_stack.setraw(x)
More information about the pypy-commit
mailing list