Author: Armin Rigo <ar...@tunes.org> Branch: stmgc-c7-rewindjmp Changeset: r72841:9d2407315c43 Date: 2014-08-17 16:01 +0200 http://bitbucket.org/pypy/pypy/changeset/9d2407315c43/
Log: Remove some other inevitable transactions diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py --- a/rpython/rlib/rstm.py +++ b/rpython/rlib/rstm.py @@ -125,21 +125,21 @@ def after_external_call(): if we_are_translated(): # starts a new transaction if we are not atomic already - llop.stm_start_inevitable_if_not_atomic(lltype.Void) + llop.stm_start_if_not_atomic(lltype.Void) after_external_call._dont_reach_me_in_del_ = True after_external_call._transaction_break_ = True @dont_look_inside -def enter_callback_call(): +def enter_callback_call(rjbuf): if we_are_translated(): - return llop.stm_enter_callback_call(lltype.Signed) + return llop.stm_enter_callback_call(lltype.Signed, rjbuf) enter_callback_call._dont_reach_me_in_del_ = True enter_callback_call._transaction_break_ = True @dont_look_inside -def leave_callback_call(token): +def leave_callback_call(rjbuf, token): if we_are_translated(): - llop.stm_leave_callback_call(lltype.Void, token) + llop.stm_leave_callback_call(lltype.Void, rjbuf, token) leave_callback_call._dont_reach_me_in_del_ = True leave_callback_call._transaction_break_ = True 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 @@ -430,7 +430,7 @@ 'stm_push_root': LLOp(), 'stm_pop_root_into': LLOp(), 'stm_commit_if_not_atomic': LLOp(canmallocgc=True), - 'stm_start_inevitable_if_not_atomic': LLOp(canmallocgc=True), + 'stm_start_if_not_atomic': LLOp(canmallocgc=True), 'stm_abort_and_retry': LLOp(canmallocgc=True), 'stm_enter_callback_call': LLOp(canmallocgc=True), 'stm_leave_callback_call': LLOp(), diff --git a/rpython/rtyper/lltypesystem/rffi.py b/rpython/rtyper/lltypesystem/rffi.py --- a/rpython/rtyper/lltypesystem/rffi.py +++ b/rpython/rtyper/lltypesystem/rffi.py @@ -315,10 +315,10 @@ source = py.code.Source(r""" def wrapper(%(args)s): # no *args - no GIL for mallocing the tuple token = 0 + rjbuf = llop.stm_rewind_jmp_frame(llmemory.Address, 1) if aroundstate is not None: if aroundstate.enter_callback is not None: - token = aroundstate.enter_callback() - llop.stm_rewind_jmp_frame(lltype.Void, 1) + token = aroundstate.enter_callback(rjbuf) else: after = aroundstate.after if after is not None: @@ -339,8 +339,7 @@ stackcounter.stacks_counter -= 1 if aroundstate is not None: if aroundstate.leave_callback is not None: - llop.stm_rewind_jmp_frame(lltype.Void, 2) - aroundstate.leave_callback(token) + aroundstate.leave_callback(rjbuf, token) else: before = aroundstate.before if before is not None: @@ -355,13 +354,16 @@ miniglobals['os'] = os miniglobals['we_are_translated'] = we_are_translated miniglobals['stackcounter'] = stackcounter + miniglobals['llmemory'] = llmemory exec source.compile() in miniglobals return miniglobals['wrapper'] _make_wrapper_for._annspecialcase_ = 'specialize:memo' AroundFnPtr = lltype.Ptr(lltype.FuncType([], lltype.Void)) -EnterCallbackFnPtr = lltype.Ptr(lltype.FuncType([], lltype.Signed)) -LeaveCallbackFnPtr = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Void)) +EnterCallbackFnPtr = lltype.Ptr(lltype.FuncType([llmemory.Address], + lltype.Signed)) +LeaveCallbackFnPtr = lltype.Ptr(lltype.FuncType([llmemory.Address, + lltype.Signed], lltype.Void)) class AroundState: _alloc_flavor_ = "raw" diff --git a/rpython/translator/stm/breakfinder.py b/rpython/translator/stm/breakfinder.py --- a/rpython/translator/stm/breakfinder.py +++ b/rpython/translator/stm/breakfinder.py @@ -4,8 +4,7 @@ TRANSACTION_BREAK = set([ 'stm_commit_if_not_atomic', - 'stm_start_inevitable_if_not_atomic', - #'stm_perform_transaction', + 'stm_start_if_not_atomic', #'stm_partial_commit_and_resume_other_threads', # new priv_revision #'jit_assembler_call', #'jit_stm_transaction_break_point', 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 @@ -156,16 +156,18 @@ def stm_commit_if_not_atomic(funcgen, op): return 'pypy_stm_commit_if_not_atomic();' -def stm_start_inevitable_if_not_atomic(funcgen, op): - return 'pypy_stm_start_inevitable_if_not_atomic();' +def stm_start_if_not_atomic(funcgen, op): + return 'pypy_stm_start_if_not_atomic();' def stm_enter_callback_call(funcgen, op): + arg0 = funcgen.expr(op.args[0]) result = funcgen.expr(op.result) - return '%s = pypy_stm_enter_callback_call();' % (result,) + return '%s = pypy_stm_enter_callback_call(%s);' % (result, arg0) def stm_leave_callback_call(funcgen, op): arg0 = funcgen.expr(op.args[0]) - return 'pypy_stm_leave_callback_call(%s);' % (arg0,) + arg1 = funcgen.expr(op.args[1]) + return 'pypy_stm_leave_callback_call(%s, %s);' % (arg0, arg1) def stm_should_break_transaction(funcgen, op): result = funcgen.expr(op.result) @@ -259,8 +261,10 @@ def stm_rewind_jmp_frame(funcgen, op): if len(op.args) == 0: + assert op.result.concretetype is lltype.Void return '/* automatic stm_rewind_jmp_frame */' elif op.args[0].value == 1: - return 'stm_rewind_jmp_enterframe(&stm_thread_local, &rjbuf1);' + assert op.result.concretetype is llmemory.Address + return '%s = &rjbuf1;' % (funcgen.expr(op.result),) else: - return 'stm_rewind_jmp_leaveframe(&stm_thread_local, &rjbuf1);' + assert False, op.args[0].value diff --git a/rpython/translator/stm/src_stm/stmgcintf.c b/rpython/translator/stm/src_stm/stmgcintf.c --- a/rpython/translator/stm/src_stm/stmgcintf.c +++ b/rpython/translator/stm/src_stm/stmgcintf.c @@ -89,41 +89,45 @@ /* stm_teardown() not called here for now; it's mostly for tests */ } -long pypy_stm_enter_callback_call(void) +long pypy_stm_enter_callback_call(void *rjbuf) { if (pypy_stm_ready_atomic == 0) { /* first time we see this thread */ assert(pypy_transaction_length >= 0); int e = errno; pypy_stm_register_thread_local(); + stm_rewind_jmp_enterframe(&stm_thread_local, (rewind_jmp_buf *)rjbuf); errno = e; pypy_stm_ready_atomic = 1; - pypy_stm_start_inevitable_if_not_atomic(); + pypy_stm_start_if_not_atomic(); return 1; } else { /* callback from C code, itself called from Python code */ - pypy_stm_start_inevitable_if_not_atomic(); + stm_rewind_jmp_enterframe(&stm_thread_local, (rewind_jmp_buf *)rjbuf); + pypy_stm_start_if_not_atomic(); return 0; } } -void pypy_stm_leave_callback_call(long token) +void pypy_stm_leave_callback_call(void *rjbuf, long token) { + int e = errno; if (token == 1) { /* if we're returning into foreign C code that was not itself called from Python code, then we're ignoring the atomic status and committing anyway. */ - int e = errno; pypy_stm_ready_atomic = 1; stm_commit_transaction(); pypy_stm_ready_atomic = 0; + stm_rewind_jmp_leaveframe(&stm_thread_local, (rewind_jmp_buf *)rjbuf); pypy_stm_unregister_thread_local(); - errno = e; } else { pypy_stm_commit_if_not_atomic(); + stm_rewind_jmp_leaveframe(&stm_thread_local, (rewind_jmp_buf *)rjbuf); } + errno = e; } void _pypy_stm_initialize_nursery_low_fill_mark(long v_counter) diff --git a/rpython/translator/stm/src_stm/stmgcintf.h b/rpython/translator/stm/src_stm/stmgcintf.h --- a/rpython/translator/stm/src_stm/stmgcintf.h +++ b/rpython/translator/stm/src_stm/stmgcintf.h @@ -53,6 +53,15 @@ } errno = e; } +static inline void pypy_stm_start_if_not_atomic(void) { + if (pypy_stm_ready_atomic == 1) { + int e = errno; + stm_start_transaction(&stm_thread_local); + _pypy_stm_initialize_nursery_low_fill_mark(0); + _pypy_stm_inev_state(); + errno = e; + } +} static inline void pypy_stm_start_inevitable_if_not_atomic(void) { if (pypy_stm_ready_atomic == 1) { int e = errno; @@ -89,8 +98,8 @@ static inline long pypy_stm_get_atomic(void) { return pypy_stm_ready_atomic - 1; } -long pypy_stm_enter_callback_call(void); -void pypy_stm_leave_callback_call(long); +long pypy_stm_enter_callback_call(void *); +void pypy_stm_leave_callback_call(void *, long); void pypy_stm_set_transaction_length(double); void pypy_stm_transaction_break(void); diff --git a/rpython/translator/stm/test/test_ztranslated.py b/rpython/translator/stm/test/test_ztranslated.py --- a/rpython/translator/stm/test/test_ztranslated.py +++ b/rpython/translator/stm/test/test_ztranslated.py @@ -73,7 +73,7 @@ rthread.start_new_thread(threadfn, ()) while glob.seen is None: llop.stm_commit_if_not_atomic(lltype.Void) - llop.stm_start_inevitable_if_not_atomic(lltype.Void) + llop.stm_start_if_not_atomic(lltype.Void) return glob.seen.value # t, cbuilder = self.compile(entry_point) @@ -470,7 +470,7 @@ lst[42] = 43 lst2[999] = lst llop.stm_commit_if_not_atomic(lltype.Void) - llop.stm_start_inevitable_if_not_atomic(lltype.Void) + llop.stm_start_if_not_atomic(lltype.Void) print 'did not crash', lst2[999][42] return 0 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit