Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: stmgc-c7 Changeset: r70689:68bd542ca517 Date: 2014-04-17 11:29 +0200 http://bitbucket.org/pypy/pypy/changeset/68bd542ca517/
Log: Merge diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py --- a/pypy/interpreter/executioncontext.py +++ b/pypy/interpreter/executioncontext.py @@ -56,10 +56,6 @@ return frame def enter(self, frame): - if self.space.config.translation.stm: - if not self.space.config.translation.jit: # XXX - from pypy.module.thread.stm import enter_frame - enter_frame(self, frame) frame.f_backref = self.topframeref self.topframeref = jit.virtual_ref(frame) @@ -81,11 +77,6 @@ frame_vref() jit.virtual_ref_finish(frame_vref, frame) - if self.space.config.translation.stm: - if not self.space.config.translation.jit: # XXX - from pypy.module.thread.stm import leave_frame - leave_frame(self, frame) - # ________________________________________________________________ def c_call_trace(self, frame, w_func, args=None): diff --git a/pypy/module/thread/stm.py b/pypy/module/thread/stm.py --- a/pypy/module/thread/stm.py +++ b/pypy/module/thread/stm.py @@ -41,21 +41,6 @@ if not we_are_translated() and not hasattr(ec, '_thread_local_dicts'): initialize_execution_context(ec) -@jit.dont_look_inside # XXX: handle abort_info_push in JIT -def enter_frame(ec, frame): - """Called from ExecutionContext.enter().""" - if frame.hide(): - return - rstm.abort_info_push(frame.pycode, ('[', 'co_filename', 'co_name', - 'co_firstlineno', 'co_lnotab')) - rstm.abort_info_push(frame, ('last_instr', ']')) - -def leave_frame(ec, frame): - """Called from ExecutionContext.leave().""" - if frame.hide(): - return - rstm.abort_info_pop(2) - class STMThreadLocals(BaseThreadLocals): diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -859,11 +859,18 @@ # (ebp is a writeable object and does not need a write-barrier # again (ensured by the code calling the loop)) self.mc.MOV(ebx, self.heap_shadowstack_top()) - self.mc.MOV_mr((self.SEGMENT_NO, ebx.value, 0), ebp.value) - # MOV [ebx], ebp if self.cpu.gc_ll_descr.stm: + self.mc.MOV_mi((self.SEGMENT_NO, ebx.value, 0), + rstm.STM_STACK_MARKER_NEW) # MOV [ebx], MARKER_NEW + self.mc.MOV_mr((self.SEGMENT_NO, ebx.value, WORD), + ebp.value) # MOV [ebx+WORD], ebp self.mc.MOV_sr(STM_OLD_SHADOWSTACK, ebx.value) - self.mc.ADD_ri(ebx.value, WORD) + # MOV [esp+xx], ebx + self.mc.ADD_ri(ebx.value, 2 * WORD) + else: + self.mc.MOV_mr((self.SEGMENT_NO, ebx.value, 0), + ebp.value) # MOV [ebx], ebp + self.mc.ADD_ri(ebx.value, WORD) self.mc.MOV(self.heap_shadowstack_top(), ebx) # MOV [rootstacktop], ebx def _call_footer_shadowstack(self): diff --git a/rpython/memory/gctransform/stmframework.py b/rpython/memory/gctransform/stmframework.py --- a/rpython/memory/gctransform/stmframework.py +++ b/rpython/memory/gctransform/stmframework.py @@ -123,7 +123,6 @@ gct_stm_become_globally_unique_transaction = _gct_with_roots_pushed gct_stm_perform_transaction = _gct_with_roots_pushed - gct_stm_inspect_abort_info = _gct_with_roots_pushed gct_stm_threadlocalref_set = _gct_with_roots_pushed diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py --- a/rpython/rlib/rstm.py +++ b/rpython/rlib/rstm.py @@ -12,6 +12,8 @@ TID = rffi.UINT tid_offset = CFlexSymbolic('offsetof(struct rpyobj_s, tid)') stm_nb_segments = CFlexSymbolic('STM_NB_SEGMENTS') +stm_stack_marker_new = CFlexSymbolic('STM_STACK_MARKER_NEW') +stm_stack_marker_old = CFlexSymbolic('STM_STACK_MARKER_OLD') adr_nursery_free = CFlexSymbolic('((long)&STM_SEGMENT->nursery_current)') adr_nursery_top = CFlexSymbolic('((long)&STM_SEGMENT->nursery_end)') adr_pypy_stm_nursery_low_fill_mark = ( @@ -79,18 +81,6 @@ def is_atomic(): return llop.stm_get_atomic(lltype.Signed) -def abort_info_push(instance, fieldnames): - "Special-cased below." - -@dont_look_inside -def abort_info_pop(count): - if we_are_translated(): - llop.stm_abort_info_pop(lltype.Void, count) - -@dont_look_inside -def charp_inspect_abort_info(): - return llop.stm_inspect_abort_info(rffi.CCHARP) - @dont_look_inside def abort_and_retry(): llop.stm_abort_and_retry(lltype.Void) @@ -160,58 +150,6 @@ # ____________________________________________________________ -class AbortInfoPush(ExtRegistryEntry): - _about_ = abort_info_push - - def compute_result_annotation(self, s_instance, s_fieldnames): - from rpython.annotator.model import SomeInstance - assert isinstance(s_instance, SomeInstance) - assert s_fieldnames.is_constant() - assert isinstance(s_fieldnames.const, tuple) # tuple of names - - def specialize_call(self, hop): - fieldnames = hop.args_s[1].const - lst = [] - v_instance = hop.inputarg(hop.args_r[0], arg=0) - for fieldname in fieldnames: - if fieldname == '[': - lst.append(-2) # start of sublist - continue - if fieldname == ']': - lst.append(-1) # end of sublist - continue - fieldname = 'inst_' + fieldname - extraofs = None - STRUCT = v_instance.concretetype.TO - while not hasattr(STRUCT, fieldname): - STRUCT = STRUCT.super - TYPE = getattr(STRUCT, fieldname) - if TYPE == lltype.Signed: - kind = 1 - elif TYPE == lltype.Unsigned: - kind = 2 - elif TYPE == lltype.Ptr(rstr.STR): - kind = 3 - extraofs = llmemory.offsetof(rstr.STR, 'chars') - else: - raise NotImplementedError( - "abort_info_push(%s, %r): field of type %r" - % (STRUCT.__name__, fieldname, TYPE)) - lst.append(kind) - lst.append(llmemory.offsetof(STRUCT, fieldname)) - if extraofs is not None: - lst.append(extraofs) - lst.append(0) - ARRAY = rffi.CArray(lltype.Signed) - array = lltype.malloc(ARRAY, len(lst), flavor='raw', immortal=True) - for i in range(len(lst)): - array[i] = lst[i] - c_array = hop.inputconst(lltype.Ptr(ARRAY), array) - hop.exception_cannot_occur() - hop.genop('stm_abort_info_push', [v_instance, c_array]) - -# ____________________________________________________________ - class ThreadLocalReference(object): _COUNT = 1 diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py --- a/rpython/rtyper/llinterp.py +++ b/rpython/rtyper/llinterp.py @@ -959,9 +959,6 @@ op_stm_get_atomic = _stm_not_implemented op_stm_change_atomic = _stm_not_implemented op_stm_set_transaction_length = _stm_not_implemented - op_stm_abort_info_push = _stm_not_implemented - op_stm_abort_info_pop = _stm_not_implemented - op_stm_inspect_abort_info = _stm_not_implemented op_stm_threadlocal_get = _stm_not_implemented op_stm_threadlocal_set = _stm_not_implemented op_stm_threadlocalref_get = _stm_not_implemented diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py --- a/rpython/rtyper/lltypesystem/lloperation.py +++ b/rpython/rtyper/lltypesystem/lloperation.py @@ -448,10 +448,6 @@ 'stm_decrement_atomic': LLOp(), 'stm_get_atomic': LLOp(sideeffects=False), - 'stm_abort_info_push': LLOp(), - 'stm_abort_info_pop': LLOp(), - 'stm_inspect_abort_info': LLOp(sideeffects=False, canmallocgc=True), - 'stm_ignored_start': LLOp(canrun=True), 'stm_ignored_stop': LLOp(canrun=True), diff --git a/rpython/translator/stm/funcgen.py b/rpython/translator/stm/funcgen.py --- a/rpython/translator/stm/funcgen.py +++ b/rpython/translator/stm/funcgen.py @@ -196,19 +196,6 @@ def stm_abort_and_retry(funcgen, op): return 'stm_abort_transaction();' -def stm_abort_info_push(funcgen, op): - arg0 = funcgen.expr(op.args[0]) - arg1 = funcgen.expr(op.args[1]) - return '//XXX stm_abort_info_push((gcptr)%s, %s);' % (arg0, arg1) - -def stm_abort_info_pop(funcgen, op): - arg0 = funcgen.expr(op.args[0]) - return '//XXX stm_abort_info_pop(%s);' % (arg0,) - -def stm_inspect_abort_info(funcgen, op): - result = funcgen.expr(op.result) - return '%s = NULL; //XXX stm_inspect_abort_info();' % (result,) - def stm_ignored_start(funcgen, op): return '/* stm_ignored_start */' diff --git a/rpython/translator/stm/src_stm/revision b/rpython/translator/stm/src_stm/revision --- a/rpython/translator/stm/src_stm/revision +++ b/rpython/translator/stm/src_stm/revision @@ -1,1 +1,1 @@ -a158a889e78b +918b1901b1f9 diff --git a/rpython/translator/stm/src_stm/stm/gcpage.c b/rpython/translator/stm/src_stm/stm/gcpage.c --- a/rpython/translator/stm/src_stm/stm/gcpage.c +++ b/rpython/translator/stm/src_stm/stm/gcpage.c @@ -380,8 +380,8 @@ struct stm_shadowentry_s *current = tl->shadowstack; struct stm_shadowentry_s *base = tl->shadowstack_base; while (current-- != base) { - assert(current->ss != (object_t *)-1); - mark_visit_object(current->ss, segment_base); + if (((uintptr_t)current->ss) > STM_STACK_MARKER_OLD) + mark_visit_object(current->ss, segment_base); } mark_visit_object(tl->thread_local_obj, segment_base); diff --git a/rpython/translator/stm/src_stm/stm/nursery.c b/rpython/translator/stm/src_stm/stm/nursery.c --- a/rpython/translator/stm/src_stm/stm/nursery.c +++ b/rpython/translator/stm/src_stm/stm/nursery.c @@ -157,10 +157,32 @@ stm_thread_local_t *tl = STM_SEGMENT->running_thread; struct stm_shadowentry_s *current = tl->shadowstack; struct stm_shadowentry_s *base = tl->shadowstack_base; - while (current-- != base) { - assert(current->ss != (object_t *)-1); - minor_trace_if_young(¤t->ss); + while (1) { + --current; + OPT_ASSERT(current >= base); + + switch ((uintptr_t)current->ss) { + + case 0: /* NULL */ + continue; + + case STM_STACK_MARKER_NEW: + /* the marker was not already seen: mark it as seen, + but continue looking more deeply in the shadowstack */ + current->ss = (object_t *)STM_STACK_MARKER_OLD; + continue; + + case STM_STACK_MARKER_OLD: + /* the marker was already seen: we can stop the + root stack tracing at this point */ + goto interrupt; + + default: + /* the stack entry is a regular pointer */ + minor_trace_if_young(¤t->ss); + } } + interrupt: minor_trace_if_young(&tl->thread_local_obj); } diff --git a/rpython/translator/stm/src_stm/stm/setup.c b/rpython/translator/stm/src_stm/stm/setup.c --- a/rpython/translator/stm/src_stm/stm/setup.c +++ b/rpython/translator/stm/src_stm/stm/setup.c @@ -154,11 +154,13 @@ struct stm_shadowentry_s *s = (struct stm_shadowentry_s *)start; tl->shadowstack = s; tl->shadowstack_base = s; + STM_PUSH_ROOT(*tl, STM_STACK_MARKER_OLD); } static void _done_shadow_stack(stm_thread_local_t *tl) { - assert(tl->shadowstack >= tl->shadowstack_base); + assert(tl->shadowstack > tl->shadowstack_base); + assert(tl->shadowstack_base->ss == (object_t *)STM_STACK_MARKER_OLD); char *start = (char *)tl->shadowstack_base; _shadowstack_trap_page(start, PROT_READ | PROT_WRITE); diff --git a/rpython/translator/stm/src_stm/stm/timing.c b/rpython/translator/stm/src_stm/stm/timing.c --- a/rpython/translator/stm/src_stm/stm/timing.c +++ b/rpython/translator/stm/src_stm/stm/timing.c @@ -71,7 +71,7 @@ s_mutex_lock(); fprintf(stderr, "thread %p:\n", tl); for (i = 0; i < _STM_TIME_N; i++) { - fprintf(stderr, " %-24s %9u %.3f s\n", + fprintf(stderr, " %-24s %9u %8.3f s\n", timer_names[i], tl->events[i], (double)tl->timing[i]); } s_mutex_unlock(); diff --git a/rpython/translator/stm/src_stm/stmgc.h b/rpython/translator/stm/src_stm/stmgc.h --- a/rpython/translator/stm/src_stm/stmgc.h +++ b/rpython/translator/stm/src_stm/stmgc.h @@ -265,6 +265,8 @@ #define STM_PUSH_ROOT(tl, p) ((tl).shadowstack++->ss = (object_t *)(p)) #define STM_POP_ROOT(tl, p) ((p) = (typeof(p))((--(tl).shadowstack)->ss)) #define STM_POP_ROOT_RET(tl) ((--(tl).shadowstack)->ss) +#define STM_STACK_MARKER_NEW 1 +#define STM_STACK_MARKER_OLD 2 /* Every thread needs to have a corresponding stm_thread_local_t _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit