Author: Armin Rigo <ar...@tunes.org> Branch: stm-gc Changeset: r54418:6982e52364be Date: 2012-04-15 19:53 +0200 http://bitbucket.org/pypy/pypy/changeset/6982e52364be/
Log: Tweaks. Try to restore the write barrier. 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 @@ -97,6 +97,7 @@ self.stm_operations = stm_operations self.nursery_size = nursery_size self.sharedarea = stmshared.StmGCSharedArea(self) + self.transactional_mode = False # def _get_size(obj): # indirection to hide 'self' return self.get_size(obj) @@ -136,9 +137,13 @@ return StmGCTLS.cast_address_to_tls_object(tls) def enter_transactional_mode(self): + ll_assert(not self.transactional_mode, "already in transactional mode") self.main_thread_tls.enter_transactional_mode() + self.transactional_mode = True def leave_transactional_mode(self): + ll_assert(self.transactional_mode, "already in non-transactional mode") + self.transactional_mode = False self.main_thread_tls.leave_transactional_mode() # ---------- @@ -226,9 +231,10 @@ tls.global_stop = result + totalsize - def collect(self, gen=0): - #raise NotImplementedError - debug_print("XXX collect() ignored") + def collect(self, gen=1): + self.get_tls().local_collection() + if gen > 0: + debug_print("XXX not doing a global collect()") def start_transaction(self): self.get_tls().start_transaction() @@ -311,11 +317,10 @@ # @dont_inline def _stm_write_barrier_global(obj): - if not stm_operations.in_transaction(): - return obj # we need to find or make a local copy hdr = self.header(obj) if hdr.tid & GCFLAG_WAS_COPIED == 0: + # # in this case, we are sure that we don't have a copy hdr.tid |= GCFLAG_WAS_COPIED # ^^^ non-protected write, but concurrent writes should @@ -332,11 +337,11 @@ return localobj # # Here, we need to really make a local copy - raise NotImplementedError size = self.get_size(obj) - tls = self.collector.get_tls() + totalsize = self.gcheaderbuilder.size_gc_header + size + tls = self.get_tls() try: - localobj = self._malloc_local_raw(tls, size) + localobj = tls.malloc_local_copy(totalsize) except MemoryError: # XXX fatalerror("MemoryError in _stm_write_barrier_global -- sorry") diff --git a/pypy/rpython/memory/gc/stmshared.py b/pypy/rpython/memory/gc/stmshared.py --- a/pypy/rpython/memory/gc/stmshared.py +++ b/pypy/rpython/memory/gc/stmshared.py @@ -48,10 +48,6 @@ adr1 = adr2 - self.gc.gcheaderbuilder.size_gc_header llarena.arena_free(llarena.getfakearenaaddress(adr1)) - def replace_special_stack(self, new_special_stack): - self.special_stack.delete() - self.special_stack = new_special_stack - def clear(self): obj = self.chained_list self.chained_list = NULL 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 @@ -39,13 +39,14 @@ # --- the local raw-malloced objects (chained list via hdr.version) #self.rawmalloced_objects = NULL # --- the local "normal" old objects (chained list via hdr.version) - self.old_objects = NULL + #self.old_objects = NULL # --- the local objects with weakrefs (chained list via hdr.version) #self.young_objects_with_weakrefs = NULL #self.old_objects_with_weakrefs = NULL # # --- a thread-local allocator for the shared area - self.sharedarea_tls = None + from pypy.rpython.memory.gc.stmshared import StmGCThreadLocalAllocator + self.sharedarea_tls = StmGCThreadLocalAllocator(self.gc.sharedarea) # self._register_with_C_code() @@ -155,7 +156,7 @@ # # Move away the previous sharedarea_tls and start a new one. from pypy.rpython.memory.gc.stmshared import StmGCThreadLocalAllocator - previous_sharedarea_tls = self.sharedarea_tls # may be None + previous_sharedarea_tls = self.sharedarea_tls self.sharedarea_tls = StmGCThreadLocalAllocator(self.gc.sharedarea) # # List of LOCAL objects pending a visit. Note that no GLOBAL @@ -182,8 +183,7 @@ # # Visit all previous OLD objects. Free the ones that have not been # visited above, and reset GCFLAG_VISITED on the others. - if previous_sharedarea_tls is not None: - self.mass_free_old_local(previous_sharedarea_tls) + self.mass_free_old_local(previous_sharedarea_tls) # # All live nursery objects are out, and the rest dies. Fill # the whole nursery with zero and reset the current nursery pointer. @@ -234,24 +234,30 @@ "odd-valued (i.e. tagged) pointer unexpected here") return self.nursery_start <= addr < self.nursery_top + def malloc_local_copy(self, totalsize): + """Allocate an object that will be used as a LOCAL copy of + some GLOBAL object.""" + localobj = self.sharedarea_tls.malloc_object(totalsize) + self.sharedarea_tls.add_special(localobj) + return localobj + # ------------------------------------------------------------ def _promote_locals_to_globals(self): ll_assert(self.local_nursery_is_empty(), "nursery must be empty [1]") + ll_assert(not self.sharedarea_tls.special_stack.non_empty(), + "special_stack should be empty here [1]") # - obj = self.old_objects - self.old_objects = NULL + # Promote all objects in sharedarea_tls to global + obj = self.sharedarea_tls.chained_list + self.sharedarea_tls.chained_list = NULL + # while obj: hdr = self.gc.header(obj) + obj = hdr.version + ll_assert(not (hdr.tid & GCFLAG_GLOBAL), "already GLOBAL [1]") + hdr.version = NULL hdr.tid |= GCFLAG_GLOBAL - obj = hdr.version - # -## obj = self.rawmalloced_objects -## self.rawmalloced_objects = NULL -## while obj: -## hdr = self.header(obj) -## hdr.tid |= GCFLAG_GLOBAL -## obj = hdr.version def _cleanup_state(self): #if self.rawmalloced_objects: @@ -259,10 +265,7 @@ # if we still have a StmGCThreadLocalAllocator, free the old unused # local objects it still contains - if self.sharedarea_tls is not None: - self.sharedarea_tls.clear() - self.sharedarea_tls.delete() - self.sharedarea_tls = None + self.sharedarea_tls.clear() def collect_roots_from_stack(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit