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

Reply via email to