Author: Remi Meier <remi.me...@gmail.com> Branch: stmgc-c4 Changeset: r67830:d483af75a05b Date: 2013-11-04 13:18 +0100 http://bitbucket.org/pypy/pypy/changeset/d483af75a05b/
Log: atomically patch assembler by stopping & aborting all other transactions during raw patching. 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 @@ -770,8 +770,6 @@ rawstart) debug_bridge(descr_number, rawstart, codeendpos) self.patch_pending_failure_recoveries(rawstart) - # patch the jump from original guard - self.patch_jump_for_descr(faildescr, rawstart) ops_offset = self.mc.ops_offset frame_depth = max(self.current_clt.frame_info.jfi_frame_depth, frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE) @@ -780,6 +778,14 @@ ops_offset=ops_offset, descr=faildescr) self.fixup_target_tokens(rawstart) self.update_frame_depth(frame_depth) + + if self.cpu.gc_ll_descr.stm: + rstm.stop_all_other_threads() + # patch the jump from original guard after the frame-depth update + self.patch_jump_for_descr(faildescr, rawstart) + if self.cpu.gc_ll_descr.stm: + rstm.partial_commit_and_resume_other_threads() + self.teardown() # oprofile support if self.cpu.profile_agent is not None: @@ -1082,7 +1088,13 @@ assert mc.get_relative_pos() == 5 else: assert mc.get_relative_pos() <= 13 + # patch assembler: + if self.cpu.gc_ll_descr.stm: + rstm.stop_all_other_threads() mc.copy_to_raw_memory(oldadr) + if self.cpu.gc_ll_descr.stm: + rstm.partial_commit_and_resume_other_threads() + def dump(self, text): if not self.verbose: diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py --- a/rpython/jit/backend/x86/runner.py +++ b/rpython/jit/backend/x86/runner.py @@ -7,6 +7,7 @@ from rpython.jit.backend.x86.profagent import ProfileAgent from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU from rpython.jit.backend.x86 import regloc +from rpython.rlib import rstm import sys @@ -127,6 +128,9 @@ def invalidate_loop(self, looptoken): from rpython.jit.backend.x86 import codebuf + if self.gc_ll_descr.stm: + rstm.stop_all_other_threads() + for addr, tgt in looptoken.compiled_loop_token.invalidate_positions: mc = codebuf.MachineCodeBlockWrapper() mc.JMP_l(tgt) @@ -134,6 +138,9 @@ mc.copy_to_raw_memory(addr - 1) # positions invalidated looptoken.compiled_loop_token.invalidate_positions = [] + + if self.gc_ll_descr.stm: + rstm.partial_commit_and_resume_other_threads() def get_all_loop_runs(self): l = lltype.malloc(LOOP_RUN_CONTAINER, 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 @@ -98,6 +98,8 @@ self.pop_roots(hop, livevars) gct_stm_become_inevitable = _gct_with_roots_pushed + gct_stm_stop_all_other_threads = _gct_with_roots_pushed + gct_stm_partial_commit_and_resume_other_threads = _gct_with_roots_pushed gct_stm_perform_transaction = _gct_with_roots_pushed gct_stm_allocate_nonmovable_int_adr = _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 @@ -34,6 +34,14 @@ llop.stm_become_inevitable(lltype.Void) @dont_look_inside +def stop_all_other_threads(): + llop.stm_stop_all_other_threads(lltype.Void) + +@dont_look_inside +def partial_commit_and_resume_other_threads(): + llop.stm_partial_commit_and_resume_other_threads(lltype.Void) + +@dont_look_inside def should_break_transaction(): return we_are_translated() and ( llop.stm_should_break_transaction(lltype.Bool)) diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py --- a/rpython/rtyper/llinterp.py +++ b/rpython/rtyper/llinterp.py @@ -977,6 +977,8 @@ op_stm_major_collect = _stm_not_implemented op_stm_abort_and_retry = _stm_not_implemented op_stm_become_inevitable = _stm_not_implemented + op_stm_stop_all_other_threads = _stm_not_implemented + op_stm_partial_commit_and_resume_other_threads = _stm_not_implemented # __________________________________________________________ # operations on addresses 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 @@ -416,6 +416,8 @@ 'stm_allocate': LLOp(sideeffects=False, canmallocgc=True), 'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False, canmallocgc=True), 'stm_become_inevitable': LLOp(canmallocgc=True), + 'stm_stop_all_other_threads': LLOp(canmallocgc=True), + 'stm_partial_commit_and_resume_other_threads': LLOp(canmallocgc=True), 'stm_minor_collect': LLOp(canmallocgc=True), 'stm_major_collect': LLOp(canmallocgc=True), 'stm_get_tid': LLOp(canfold=True), diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py --- a/rpython/translator/c/funcgen.py +++ b/rpython/translator/c/funcgen.py @@ -586,6 +586,8 @@ OP_STM_INITIALIZE = _OP_STM OP_STM_FINALIZE = _OP_STM OP_STM_BECOME_INEVITABLE = _OP_STM + OP_STM_STOP_ALL_OTHER_THREADS = _OP_STM + OP_STM_PARTIAL_COMMIT_AND_RESUME_OTHER_THREADS = _OP_STM OP_STM_BARRIER = _OP_STM OP_STM_PTR_EQ = _OP_STM OP_STM_PUSH_ROOT = _OP_STM 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 @@ -103,6 +103,12 @@ string_literal = c_string_constant(info) return 'stm_become_inevitable(%s);' % (string_literal,) +def stm_stop_all_other_threads(funcgen, op): + return 'stm_stop_all_other_threads();' + +def stm_partial_commit_and_resume_other_threads(funcgen, op): + return 'stm_partial_commit_and_resume_other_threads();' + def stm_push_root(funcgen, op): arg0 = funcgen.expr(op.args[0]) return 'stm_push_root((gcptr)%s);' % (arg0,) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit