Author: Armin Rigo <ar...@tunes.org> Branch: stmgc-c7 Changeset: r75564:963abcf27a42 Date: 2015-01-28 16:54 +0100 http://bitbucket.org/pypy/pypy/changeset/963abcf27a42/
Log: Fixes, and partial revert: must use _HASHTABLE_OBJ everywhere in RPython, not the low-level _STM_HASHTABLE_P, because the latter is not traced! diff --git a/rpython/jit/metainterp/memmgr.py b/rpython/jit/metainterp/memmgr.py --- a/rpython/jit/metainterp/memmgr.py +++ b/rpython/jit/metainterp/memmgr.py @@ -76,8 +76,8 @@ next_key = rstm.stm_count() gcref = annlowlevel.cast_instance_to_gcref(looptoken) if not self.stm_alive_loops: - self.stm_alive_loops = rstm.ll_hashtable_create() - rstm.ll_hashtable_set(self.stm_alive_loops, next_key, gcref) + self.stm_alive_loops = rstm.create_hashtable() + self.stm_alive_loops.set(next_key, gcref) def _kill_old_loops_now(self): debug_start("jit-mem-collect") @@ -103,14 +103,16 @@ # all keys in 'stm_alive_loops' should be in the following range old_count = self.stm_lowest_key new_count = rstm.stm_count() + oldtotal = 0 if stm_alive_loops: for key in range(old_count, new_count): - gcref = rstm.ll_hashtable_get(stm_alive_loops, key) + gcref = stm_alive_loops.get(key) if not gcref: continue # make 'stm_alive_loops' empty, and add the loops that we # must keep in the set 'keep_loops' - rstm.ll_hashtable_set(stm_alive_loops, key, rstm.NULL_GCREF) + stm_alive_loops.set(key, rstm.NULL_GCREF) + oldtotal += 1 looptoken = annlowlevel.cast_gcref_to_instance(JitCellToken, gcref) if self._must_keep_loop(looptoken): @@ -120,7 +122,7 @@ # now re-add loops with key numbers that *end* at 'new_count' for looptoken in keep_loops: gcref = annlowlevel.cast_instance_to_gcref(looptoken) - rstm.ll_hashtable_set(stm_alive_loops, new_count, gcref) + stm_alive_loops.set(new_count, gcref) new_count -= 1 self.stm_lowest_key = new_count + 1 # lowest used key number # diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py --- a/rpython/rlib/rstm.py +++ b/rpython/rlib/rstm.py @@ -1,5 +1,5 @@ from rpython.rlib.objectmodel import we_are_translated, specialize -from rpython.rlib.objectmodel import CDefinedIntSymbolic +from rpython.rlib.objectmodel import CDefinedIntSymbolic, stm_ignored from rpython.rlib.nonconst import NonConstant from rpython.rlib import rgc from rpython.rtyper.lltypesystem import lltype, rffi, rstr, llmemory @@ -177,54 +177,38 @@ # ____________________________________________________________ _STM_HASHTABLE_P = rffi.COpaquePtr('stm_hashtable_t') -NULL_HASHTABLE = lltype.nullptr(_STM_HASHTABLE_P.TO) _STM_HASHTABLE_ENTRY = lltype.GcStruct('HASHTABLE_ENTRY', ('index', lltype.Unsigned), ('object', llmemory.GCREF)) @dont_look_inside -def ll_hashtable_create(): - # Pass a null pointer to _STM_HASHTABLE_ENTRY to stm_hashtable_create(). - # Make sure we see a malloc() of it, so that its typeid is correctly - # initialized. It can be done in a NonConstant(False) path so that - # the C compiler will actually drop it. - if _false: - p = lltype.malloc(_STM_HASHTABLE_ENTRY) - else: - p = lltype.nullptr(_STM_HASHTABLE_ENTRY) - return llop.stm_hashtable_create(_STM_HASHTABLE_P, p) - -@dont_look_inside -def ll_hashtable_get(h, key): +def _ll_hashtable_get(h, key): # 'key' must be a plain integer. Returns a GCREF. return llop.stm_hashtable_read(llmemory.GCREF, h, h.ll_raw_hashtable, key) @dont_look_inside -def ll_hashtable_set(h, key, value): +def _ll_hashtable_set(h, key, value): llop.stm_hashtable_write(lltype.Void, h, h.ll_raw_hashtable, key, value) -@dont_look_inside -def ll_hashtable_free(h): - llop.stm_hashtable_free(lltype.Void, h) - -# ----- _HASHTABLE_OBJ = lltype.GcStruct('HASHTABLE_OBJ', ('ll_raw_hashtable', _STM_HASHTABLE_P), rtti=True, - adtmeths={'get': ll_hashtable_get, - 'set': ll_hashtable_set}) + adtmeths={'get': _ll_hashtable_get, + 'set': _ll_hashtable_set}) +NULL_HASHTABLE = lltype.nullptr(_HASHTABLE_OBJ) -def ll_hashtable_trace(gc, obj, callback, arg): +def _ll_hashtable_trace(gc, obj, callback, arg): from rpython.memory.gctransform.stmframework import get_visit_function visit_fn = get_visit_function(callback, arg) addr = obj + llmemory.offsetof(_HASHTABLE_OBJ, 'll_raw_hashtable') llop.stm_hashtable_tracefn(lltype.Void, addr.address[0], visit_fn) -lambda_hashtable_trace = lambda: ll_hashtable_trace +lambda_hashtable_trace = lambda: _ll_hashtable_trace -def ll_hashtable_finalizer(p): - ll_hashtable_free(p.ll_raw_hashtable) -lambda_hashtable_finlz = lambda: ll_hashtable_finalizer +def _ll_hashtable_finalizer(h): + if h.ll_raw_hashtable: + llop.stm_hashtable_free(lltype.Void, h.ll_raw_hashtable) +lambda_hashtable_finlz = lambda: _ll_hashtable_finalizer _false = CDefinedIntSymbolic('0', default=0) # remains in the C code @@ -234,8 +218,17 @@ return HashtableForTest() # for tests rgc.register_custom_light_finalizer(_HASHTABLE_OBJ, lambda_hashtable_finlz) rgc.register_custom_trace_hook(_HASHTABLE_OBJ, lambda_hashtable_trace) + # Pass a null pointer to _STM_HASHTABLE_ENTRY to stm_hashtable_create(). + # Make sure we see a malloc() of it, so that its typeid is correctly + # initialized. It can be done in a NonConstant(False) path so that + # the C compiler will actually drop it. + if _false: + p = lltype.malloc(_STM_HASHTABLE_ENTRY) + else: + p = lltype.nullptr(_STM_HASHTABLE_ENTRY) h = lltype.malloc(_HASHTABLE_OBJ) - h.ll_raw_hashtable = ll_hashtable_create() + h.ll_raw_hashtable = lltype.nullptr(_STM_HASHTABLE_P.TO) + h.ll_raw_hashtable = llop.stm_hashtable_create(_STM_HASHTABLE_P, p) return h NULL_GCREF = lltype.nullptr(llmemory.GCREF.TO) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit