Author: Armin Rigo <[email protected]>
Branch: tealet
Changeset: r46001:ca5a04e1b758
Date: 2011-07-26 11:41 +0200
http://bitbucket.org/pypy/pypy/changeset/ca5a04e1b758/
Log: The test in rlib/test_rtealet passes now.
diff --git a/pypy/rlib/_tealet_rffi.py b/pypy/rlib/_tealet_rffi.py
--- a/pypy/rlib/_tealet_rffi.py
+++ b/pypy/rlib/_tealet_rffi.py
@@ -1,5 +1,5 @@
import os
-from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.rpython.lltypesystem import lltype, llmemory, rffi
from pypy.translator.tool.cbuild import ExternalCompilationInfo
eci = ExternalCompilationInfo(
diff --git a/pypy/rlib/rtealet.py b/pypy/rlib/rtealet.py
--- a/pypy/rlib/rtealet.py
+++ b/pypy/rlib/rtealet.py
@@ -61,13 +61,13 @@
switcher = Switcher()
llswitcher = lltype.malloc(rffi.CArray(_tealet_rffi.TEALET_P), 1,
- flavor='raw', zero=True)
+ flavor='raw', zero=True, track_allocation=False)
def _new(main, starting_tealet):
switcher.current = main.current
switcher.target = starting_tealet
llswitcher[0] = main.lltealet
- r = _stack_protected_call(llhelper(FUNCNOARG, _new_critical))
+ r = _stack_protected_call(llhelper(FUNCNOARG_P, _new_critical))
_check_exception(r)
def _new_critical():
@@ -110,7 +110,7 @@
switcher.target = target
main.current = target
llswitcher[0] = target.lltealet
- r = _stack_protected_call(llhelper(FUNCNOARG, _switch_critical))
+ r = _stack_protected_call(llhelper(FUNCNOARG_P, _switch_critical))
_check_exception(r)
def _switch_critical():
@@ -154,7 +154,7 @@
return _tealetrootwalker
from pypy.rpython.memory.gctransform.asmgcroot import (
- WALKFRAME, CALLEE_SAVED_REGS)
+ WALKFRAME, CALLEE_SAVED_REGS, sizeofaddr)
assert _asmstackrootwalker is not None, "should have been monkey-patched"
basewalker = _asmstackrootwalker
@@ -170,13 +170,29 @@
if not p.context:
return False
self.context = p.context
- initialframedata = p.initialframedata
+ anchor = p.anchor
del p
self.curframe = lltype.malloc(WALKFRAME, flavor='raw')
self.otherframe = lltype.malloc(WALKFRAME, flavor='raw')
- basewalker.fill_initial_frame(self.curframe, self.initialframedata)
+ initialframedata = anchor[1]
+ ll_assert(initialframedata != llmemory.cast_ptr_to_adr(anchor),
+ "no anchored tealet stack found")
+ ll_assert(initialframedata == anchor[0],
+ "more than one anchored tealet stack found")
+ self.fill_initial_frame(self.curframe, initialframedata)
return True
+ def fill_initial_frame(self, curframe, initialframedata):
+ # Copy&paste :-(
+ initialframedata += 2*sizeofaddr
+ reg = 0
+ while reg < CALLEE_SAVED_REGS:
+ curframe.regs_stored_at[reg] = initialframedata+reg*sizeofaddr
+ reg += 1
+ retaddraddr = initialframedata + CALLEE_SAVED_REGS * sizeofaddr
+ retaddraddr = self.translateptr(retaddraddr)
+ curframe.frame_address = retaddraddr.address[0]
+
def teardown(self):
lltype.free(self.curframe, flavor='raw')
lltype.free(self.otherframe, flavor='raw')
@@ -197,13 +213,12 @@
# of course the stack itself is full of non-translated pointers.
#
while True:
- callee = self.curframe
- #
if not self.enumerating:
if not prev:
if not self.setup(obj): # one-time initialization
return llmemory.NULL
prev = obj # random value, but non-NULL
+ callee = self.curframe
retaddraddr = self.translateptr(callee.frame_address)
retaddr = retaddraddr.address[0]
basewalker.locate_caller_based_on_retaddr(retaddr)
@@ -211,6 +226,7 @@
#
# not really a loop, but kept this way for similarity
# with asmgcroot:
+ callee = self.curframe
while True:
location = basewalker._shape_decompressor.next()
if location == 0:
@@ -275,10 +291,14 @@
p = lltype.malloc(SUSPSTACK)
p.context = _tealet_rffi.NULL_TEALET
p.my_index = len(self.lst)
+ p.next_unused = -42000000
+ p.anchor = lltype.malloc(ASM_FRAMEDATA_HEAD_PTR.TO, flavor='raw',
+ track_allocation=False)
self.lst.append(p)
else:
p = self.lst[self.first_unused]
self.first_unused = p.next_unused
+ p.anchor[0] = p.anchor[1] = llmemory.cast_ptr_to_adr(p.anchor)
return p
def release(self, p):
@@ -288,21 +308,19 @@
suspendedstacks = SuspendedStacks()
def _stack_protected_call(callback):
- # :-/
p = suspendedstacks.acquire()
- suspendedstacks.callback = callback
- anchor = lltype.malloc(ASM_FRAMEDATA_HEAD_PTR.TO, flavor='raw')
- anchor[0] = anchor[1] = llmemory.cast_ptr_to_adr(anchor)
- p.anchor = anchor
- r = pypy_asm_stackwalk2(callback, anchor)
+ p.context = switcher.current.lltealet
+ llop.gc_assume_young_pointers(lltype.Void,
+ llmemory.cast_ptr_to_adr(p))
+ r = pypy_asm_stackwalk2(callback, p.anchor)
+ p.context = _tealet_rffi.NULL_TEALET
suspendedstacks.release(p)
- lltype.free(anchor, flavor='raw')
return r
-FUNCNOARG = lltype.FuncType([], rffi.INT)
+FUNCNOARG_P = lltype.Ptr(lltype.FuncType([], rffi.INT))
pypy_asm_stackwalk2 = rffi.llexternal('pypy_asm_stackwalk',
- [lltype.Ptr(FUNCNOARG),
+ [FUNCNOARG_P,
ASM_FRAMEDATA_HEAD_PTR],
rffi.INT, sandboxsafe=True,
_nowrapper=True)
diff --git a/pypy/rlib/test/test_rtealet.py b/pypy/rlib/test/test_rtealet.py
--- a/pypy/rlib/test/test_rtealet.py
+++ b/pypy/rlib/test/test_rtealet.py
@@ -1,4 +1,5 @@
import py
+from pypy.config.config import ConflictConfigError
from pypy.translator.c.test.test_standalone import StandaloneTests
@@ -9,7 +10,10 @@
config = get_pypy_config(translating=True)
config.translation.gc = "minimark"
config.translation.gcrootfinder = cls.gcrootfinder
- config.translation.tealet = True
+ try:
+ config.translation.tealet = True
+ except ConflictConfigError, e:
+ py.test.skip(str(e))
cls.config = config
def test_demo1(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit