[pypy-commit] pypy concurrent-marksweep: Rename the write_barrier in concurrentms to "deletion_barrier",

arigo noreply at buildbot.pypy.org
Tue Oct 11 14:41:40 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: concurrent-marksweep
Changeset: r47936:cbf2c361a9bb
Date: 2011-10-11 14:41 +0200
http://bitbucket.org/pypy/pypy/changeset/cbf2c361a9bb/

Log:	Rename the write_barrier in concurrentms to "deletion_barrier", as
	it has subtly different semantics about when it is ok or not to kill
	a call to it.

diff --git a/pypy/rpython/memory/gc/base.py b/pypy/rpython/memory/gc/base.py
--- a/pypy/rpython/memory/gc/base.py
+++ b/pypy/rpython/memory/gc/base.py
@@ -16,6 +16,7 @@
     _alloc_flavor_ = "raw"
     moving_gc = False
     needs_write_barrier = False
+    needs_deletion_barrier = False
     malloc_zero_filled = False
     prebuilt_gc_objects_are_static_roots = True
     object_minimal_size = 0
diff --git a/pypy/rpython/memory/gc/concurrentms.py b/pypy/rpython/memory/gc/concurrentms.py
--- a/pypy/rpython/memory/gc/concurrentms.py
+++ b/pypy/rpython/memory/gc/concurrentms.py
@@ -46,7 +46,7 @@
     _alloc_flavor_ = "raw"
     inline_simple_malloc = True
     inline_simple_malloc_varsize = True
-    needs_write_barrier = True
+    needs_deletion_barrier = True
     prebuilt_gc_objects_are_static_roots = False
     malloc_zero_filled = True
     gcflag_extra = FL_EXTRA
@@ -468,18 +468,11 @@
         return adr + self.gcheaderbuilder.size_gc_header
     grow_reservation._always_inline_ = True
 
-    def write_barrier(self, newvalue, addr_struct):
+    def deletion_barrier(self, addr_struct):
         mark = self.header(addr_struct).tid & 0xFF
         if mark != self.current_mark:
             self.force_scan(addr_struct)
 
-    def writebarrier_before_copy(self, source_addr, dest_addr,
-                                 source_start, dest_start, length):
-        mark = self.header(dest_addr).tid & 0xFF
-        if mark != self.current_mark:
-            self.force_scan(dest_addr)
-        return True
-
     def assume_young_pointers(self, addr_struct):
         pass # XXX
 
@@ -527,6 +520,7 @@
             #
             self.acquire(self.finished_lock)
             self.collection_running = 0
+            debug_print("collection_running = 0")
             #
             # Check invariants
             ll_assert(not self.extra_objects_to_mark.non_empty(),
@@ -655,6 +649,7 @@
         #
         # Start the collector thread
         self.collection_running = 1
+        debug_print("collection_running = 1")
         self.release(self.ready_to_start_lock)
         #
         debug_stop("gc-start")
@@ -748,6 +743,7 @@
             # Mark
             self.collector_mark()
             self.collection_running = 2
+            debug_print("collection_running = 2")
             #
             self.deal_with_objects_with_finalizers()
             #
@@ -756,6 +752,7 @@
             #
             # Done!
             self.collection_running = -1
+            debug_print("collection_running = -1")
             self.release(self.finished_lock)
 
 
diff --git a/pypy/rpython/memory/gc/test/test_direct.py b/pypy/rpython/memory/gc/test/test_direct.py
--- a/pypy/rpython/memory/gc/test/test_direct.py
+++ b/pypy/rpython/memory/gc/test/test_direct.py
@@ -90,6 +90,9 @@
             newaddr = llmemory.cast_ptr_to_adr(newvalue)
             addr_struct = llmemory.cast_ptr_to_adr(p)
             self.gc.write_barrier(newaddr, addr_struct)
+        elif self.gc.needs_deletion_barrier:
+            addr_struct = llmemory.cast_ptr_to_adr(p)
+            self.gc.deletion_barrier(addr_struct)
         setattr(p, fieldname, newvalue)
 
     def writearray(self, p, index, newvalue):
@@ -100,6 +103,9 @@
                 self.gc.write_barrier_from_array(newaddr, addr_struct, index)
             else:
                 self.gc.write_barrier(newaddr, addr_struct)
+        elif self.gc.needs_deletion_barrier:
+            addr_struct = llmemory.cast_ptr_to_adr(p)
+            self.gc.deletion_barrier(addr_struct)
         p[index] = newvalue
 
     def malloc(self, TYPE, n=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
@@ -440,6 +440,7 @@
 
         self.write_barrier_ptr = None
         self.write_barrier_from_array_ptr = None
+        self.deletion_barrier_ptr = None
         if GCClass.needs_write_barrier:
             self.write_barrier_ptr = getfn(GCClass.write_barrier.im_func,
                                            [s_gc,
@@ -475,6 +476,12 @@
                                                     annmodel.SomeInteger(),
                                                     annmodel.SomeAddress()],
                                                    annmodel.s_None)
+        elif GCClass.needs_deletion_barrier:
+            self.deletion_barrier_ptr = getfn(GCClass.deletion_barrier.im_func,
+                                              [s_gc, annmodel.SomeAddress()],
+                                              annmodel.s_None,
+                                              inline=True)
+
         self.statistics_ptr = getfn(GCClass.statistics.im_func,
                                     [s_gc, annmodel.SomeInteger()],
                                     annmodel.SomeInteger())
@@ -551,7 +558,7 @@
         log.info("assigned %s typeids" % (len(group.members), ))
         log.info("added %s push/pop stack root instructions" % (
                      self.num_pushs, ))
-        if self.write_barrier_ptr:
+        if self.write_barrier_ptr or self.deletion_barrier_ptr:
             log.info("inserted %s write barrier calls" % (
                          self.write_barrier_calls, ))
         if self.write_barrier_from_array_ptr:
@@ -1136,6 +1143,18 @@
                                           self.c_const_gc,
                                           v_newvalue,
                                           v_structaddr])
+        elif (self.deletion_barrier_ptr
+              and v_struct.concretetype.TO._gckind == "gc"):
+            # The MostlyConcurrentMarkSweepGC is a case where the
+            # write barrier is best called a "deletion barrier" instead.
+            # It needs different logic here (and at a few other places).
+            # XXX try harder to omit some calls!
+            v_structaddr = hop.genop("cast_ptr_to_adr", [v_struct],
+                                     resulttype = llmemory.Address)
+            self.write_barrier_calls += 1
+            hop.genop("direct_call", [self.deletion_barrier_ptr,
+                                      self.c_const_gc,
+                                      v_structaddr])
         hop.rename('bare_' + opname)
 
     def transform_getfield_typeptr(self, hop):
diff --git a/pypy/rpython/memory/gcwrapper.py b/pypy/rpython/memory/gcwrapper.py
--- a/pypy/rpython/memory/gcwrapper.py
+++ b/pypy/rpython/memory/gcwrapper.py
@@ -144,6 +144,10 @@
             return self.gc.writebarrier_before_copy(source_addr, dest_addr,
                                                     source_start, dest_start,
                                                     length)
+        elif self.gc.needs_deletion_barrier:
+            dest_addr = llmemory.cast_ptr_to_adr(dest)
+            self.gc.deletion_barrier(dest_addr)
+            return True
         else:
             return True
 


More information about the pypy-commit mailing list