Author: Armin Rigo <ar...@tunes.org> Branch: stm-gc Changeset: r54414:0dbdf68abd87 Date: 2012-04-15 15:59 +0200 http://bitbucket.org/pypy/pypy/changeset/0dbdf68abd87/
Log: Transaction fixes. diff --git a/pypy/rlib/debug.py b/pypy/rlib/debug.py --- a/pypy/rlib/debug.py +++ b/pypy/rlib/debug.py @@ -6,6 +6,7 @@ def ll_assert(x, msg): """After translation to C, this becomes an RPyAssert.""" + assert type(x) is bool, "bad type! got %r" % (type(x),) assert x, msg class Entry(ExtRegistryEntry): diff --git a/pypy/rpython/memory/gc/stmgc.py b/pypy/rpython/memory/gc/stmgc.py --- a/pypy/rpython/memory/gc/stmgc.py +++ b/pypy/rpython/memory/gc/stmgc.py @@ -123,6 +123,13 @@ self.main_thread_tls = StmGCTLS(self, in_main_thread=True) self.main_thread_tls.start_transaction() + def setup_thread(self): + from pypy.rpython.memory.gc.stmtls import StmGCTLS + StmGCTLS(self, in_main_thread=False) + + def teardown_thread(self): + self.get_tls().teardown_thread() + @always_inline def get_tls(self): from pypy.rpython.memory.gc.stmtls import StmGCTLS @@ -228,6 +235,7 @@ self.get_tls().start_transaction() def commit_transaction(self): + raise NotImplementedError self.collector.commit_transaction() @@ -325,6 +333,7 @@ return localobj # # Here, we need to really make a local copy + raise NotImplementedError size = self.get_size(obj) tls = self.collector.get_tls() try: @@ -390,6 +399,7 @@ """Implement the common logic of id() and identityhash() of an object, given as a GCREF. """ + raise NotImplementedError obj = llmemory.cast_ptr_to_adr(gcobj) hdr = self.header(obj) # diff --git a/pypy/rpython/memory/gc/stmtls.py b/pypy/rpython/memory/gc/stmtls.py --- a/pypy/rpython/memory/gc/stmtls.py +++ b/pypy/rpython/memory/gc/stmtls.py @@ -85,7 +85,7 @@ def cast_address_to_tls_object(tlsaddr): if we_are_translated(): tls = llmemory.cast_adr_to_ptr(tlsaddr, base_ptr_lltype()) - return cast_base_ptr_to_instance(tls) + return cast_base_ptr_to_instance(StmGCTLS, tls) else: n = rffi.cast(lltype.Signed, tlsaddr) return StmGCTLS.nontranslated_dict[n] @@ -135,7 +135,8 @@ self.nursery_top = self.nursery_start + self.nursery_size def local_nursery_is_empty(self): - ll_assert(self.nursery_free, "local_nursery_is_empty: gc not running") + ll_assert(bool(self.nursery_free), + "local_nursery_is_empty: gc not running") return self.nursery_free == self.nursery_start # ------------------------------------------------------------ @@ -202,7 +203,7 @@ No more mallocs are allowed after this is called. """ - xxx + raise NotImplementedError # ------------------------------------------------------------ @@ -242,7 +243,7 @@ obj = self.old_objects self.old_objects = NULL while obj: - hdr = self.header(obj) + hdr = self.gc.header(obj) hdr.tid |= GCFLAG_GLOBAL obj = hdr.version # @@ -266,11 +267,8 @@ def collect_roots_from_stack(self): - self.gc.root_walker.walk_roots( - StmGCTLS._trace_drag_out1, # stack roots of the current thread - None, # static in prebuilt non-gc - None, # static in prebuilt gc - self) + self.gc.root_walker.walk_current_stack_roots( + StmGCTLS._trace_drag_out1, self) def _trace_drag_out1(self, root): self._trace_drag_out(root, None) diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py --- a/pypy/rpython/memory/gctransform/framework.py +++ b/pypy/rpython/memory/gctransform/framework.py @@ -1374,19 +1374,16 @@ def walk_roots(self, collect_stack_root, collect_static_in_prebuilt_nongc, - collect_static_in_prebuilt_gc, - arg=None): + collect_static_in_prebuilt_gc): gcdata = self.gcdata gc = self.gc - if arg is None: - arg = gc if collect_static_in_prebuilt_nongc: addr = gcdata.static_root_start end = gcdata.static_root_nongcend while addr != end: result = addr.address[0] if gc.points_to_valid_gc_object(result): - collect_static_in_prebuilt_nongc(arg, result) + collect_static_in_prebuilt_nongc(gc, result) addr += sizeofaddr if collect_static_in_prebuilt_gc: addr = gcdata.static_root_nongcend @@ -1394,10 +1391,10 @@ while addr != end: result = addr.address[0] if gc.points_to_valid_gc_object(result): - collect_static_in_prebuilt_gc(arg, result) + collect_static_in_prebuilt_gc(gc, result) addr += sizeofaddr if collect_stack_root: - self.walk_stack_roots(collect_stack_root, arg) # abstract + self.walk_stack_roots(collect_stack_root) # abstract def need_stacklet_support(self): raise Exception("%s does not support stacklets" % ( diff --git a/pypy/rpython/memory/gctransform/stmframework.py b/pypy/rpython/memory/gctransform/stmframework.py --- a/pypy/rpython/memory/gctransform/stmframework.py +++ b/pypy/rpython/memory/gctransform/stmframework.py @@ -1,9 +1,11 @@ from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer from pypy.rpython.memory.gctransform.framework import BaseRootWalker from pypy.rpython.memory.gctransform.framework import sizeofaddr -from pypy.rpython.lltypesystem import llmemory +from pypy.rpython.lltypesystem import lltype, llmemory from pypy.annotation import model as annmodel from pypy.rlib.debug import fatalerror_notb +from pypy.rlib.nonconst import NonConstant +from pypy.rlib.objectmodel import specialize class StmFrameworkGCTransformer(FrameworkGCTransformer): @@ -33,11 +35,11 @@ self.gcdata.gc.stm_normalize_global, [annmodel.SomeAddress()], annmodel.SomeAddress()) self.stm_enter_transactional_mode_ptr = getfn( - self.gcdata.gc.enter_transactional_mode.im_func - [s_sc], annmodel.s_None) + self.gcdata.gc.enter_transactional_mode.im_func, + [s_gc], annmodel.s_None) self.stm_leave_transactional_mode_ptr = getfn( - self.gcdata.gc.leave_transactional_mode.im_func - [s_sc], annmodel.s_None) + self.gcdata.gc.leave_transactional_mode.im_func, + [s_gc], annmodel.s_None) self.stm_start_ptr = getfn( self.gcdata.gc.start_transaction.im_func, [s_gc], annmodel.s_None) @@ -110,7 +112,8 @@ self.decr_stack = decr_stack root_iterator = shadowstack.get_root_iterator(gctransformer) - def walk_stack_root(callback, start, end): + @specialize.argtype(1) + def walk_stack_root(callback, arg, start, end): root_iterator.setcontext(NonConstant(llmemory.NULL)) gc = self.gc addr = end @@ -118,7 +121,7 @@ addr = root_iterator.nextleft(gc, start, addr) if addr == llmemory.NULL: return - callback(gc, addr) + callback(arg, addr) self.rootstackhook = walk_stack_root rsd = gctransformer.root_stack_depth @@ -143,10 +146,18 @@ llmemory.raw_free(base) def walk_stack_roots(self, collect_stack_root): + raise NotImplementedError # XXX only to walk the main thread's shadow stack, so far stackgcdata = self.stackgcdata if self.gcdata.main_thread_stack_base != stackgcdata.root_stack_base: fatalerror_notb("XXX not implemented: walk_stack_roots in thread") - self.rootstackhook(collect_stack_root, + self.rootstackhook(collect_stack_root, self.gcdata.gc, stackgcdata.root_stack_base, stackgcdata.root_stack_top) + + @specialize.argtype(2) + def walk_current_stack_roots(self, collect_stack_root, arg): + stackgcdata = self.stackgcdata + self.rootstackhook(collect_stack_root, arg, + stackgcdata.root_stack_base, + stackgcdata.root_stack_top) diff --git a/pypy/rpython/memory/gctypelayout.py b/pypy/rpython/memory/gctypelayout.py --- a/pypy/rpython/memory/gctypelayout.py +++ b/pypy/rpython/memory/gctypelayout.py @@ -433,7 +433,11 @@ # local data structure. We assume that objects are stored # only temporarily there, so it is always cleared at the point # where we collect the roots. - assert TYPE._name == 'ExcData' + if TYPE._name == 'ExcData': + return + # Some other thread-local data don't have any GC pointers + # themselves. These are fine. + assert list(gc_pointers_inside(value, adr)) == [] return else: appendto = self.addresses_of_static_ptrs_in_nongc _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit