Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: stmgc-c7 Changeset: r71481:4c7f65787861 Date: 2014-05-13 10:48 +0200 http://bitbucket.org/pypy/pypy/changeset/4c7f65787861/
Log: Reduce the limit of inevitable transactions instead of setting it to 0. Depend a bit on stmcb_commit_soon() in order for other transactions to signal us in case we block them. 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 @@ -29,7 +29,7 @@ /* atomic */ pypy_stm_nursery_low_fill_mark_saved = 0; } else { - pypy_stm_nursery_low_fill_mark >>= 2; + pypy_stm_nursery_low_fill_mark = 0; } } @@ -101,12 +101,8 @@ } } -void pypy_stm_start_transaction(stm_jmpbuf_t *jmpbuf_ptr, - volatile long *v_counter) +void _pypy_stm_initialize_nursery_low_fill_mark(long v_counter) { - pypy_stm_nursery_low_fill_mark = 1; /* will be set to a correct value below */ - _stm_start_transaction(&stm_thread_local, jmpbuf_ptr); - /* If v_counter==0, initialize 'pypy_stm_nursery_low_fill_mark' from the configured length limit. If v_counter>0, we did an abort, and we now configure 'pypy_stm_nursery_low_fill_mark' @@ -120,8 +116,7 @@ counter = _htm_info.retry_counter; limit = pypy_transaction_length >> counter; #else - counter = *v_counter; - *v_counter = counter + 1; + counter = v_counter; if (counter == 0) { limit = pypy_transaction_length; @@ -133,6 +128,17 @@ #endif pypy_stm_nursery_low_fill_mark = _stm_nursery_start + limit; +} + +void pypy_stm_start_transaction(stm_jmpbuf_t *jmpbuf_ptr, + volatile long *v_counter) +{ + pypy_stm_nursery_low_fill_mark = 1; /* will be set to a correct value below */ + _stm_start_transaction(&stm_thread_local, jmpbuf_ptr); + + _pypy_stm_initialize_nursery_low_fill_mark(*v_counter); + *v_counter = *v_counter + 1; + pypy_stm_ready_atomic = 1; /* reset after abort */ } @@ -157,8 +163,6 @@ transaction. */ assert(pypy_stm_nursery_low_fill_mark != (uintptr_t) -1); - assert(!(STM_SEGMENT->jmpbuf_ptr == NULL) || - (pypy_stm_nursery_low_fill_mark == 0)); stm_commit_transaction(); @@ -195,8 +199,10 @@ //assert(pypy_stm_nursery_low_fill_mark != 0); assert(pypy_stm_nursery_low_fill_mark != (uintptr_t) -1); stm_commit_transaction(); - pypy_stm_nursery_low_fill_mark = 0; + stm_start_inevitable_transaction(&stm_thread_local); + _pypy_stm_initialize_nursery_low_fill_mark(0); + _pypy_stm_inev_state(); } else { assert(pypy_stm_nursery_low_fill_mark == (uintptr_t) -1); @@ -206,8 +212,6 @@ } /* double-check */ if (pypy_stm_ready_atomic == 1) { - assert(!(STM_SEGMENT->jmpbuf_ptr == NULL) || - (pypy_stm_nursery_low_fill_mark == 0)); } else { assert(pypy_stm_nursery_low_fill_mark == (uintptr_t) -1); @@ -219,14 +223,17 @@ assert(v_old_shadowstack == stm_thread_local.shadowstack); } -static void _pypy_stm_inev_state(void) +void _pypy_stm_inev_state(void) { + /* Reduce the limit so that inevitable transactions are generally + shorter. We depend a bit on stmcb_commit_soon() in order for + other transactions to signal us in case we block them. */ if (pypy_stm_ready_atomic == 1) { - pypy_stm_nursery_low_fill_mark = 0; + pypy_stm_nursery_low_fill_mark >>= 2; } else { assert(pypy_stm_nursery_low_fill_mark == (uintptr_t) -1); - pypy_stm_nursery_low_fill_mark_saved = 0; + pypy_stm_nursery_low_fill_mark_saved >>= 2; } } 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 @@ -23,6 +23,9 @@ void pypy_stm_register_thread_local(void); /* generated into stm_prebuilt.c */ void pypy_stm_unregister_thread_local(void); /* generated into stm_prebuilt.c */ +void _pypy_stm_initialize_nursery_low_fill_mark(long v_counter); +void _pypy_stm_inev_state(void); + void _pypy_stm_become_inevitable(const char *); void pypy_stm_become_globally_unique_transaction(void); @@ -52,8 +55,9 @@ static inline void pypy_stm_start_inevitable_if_not_atomic(void) { if (pypy_stm_ready_atomic == 1) { int e = errno; - pypy_stm_nursery_low_fill_mark = 0; stm_start_inevitable_transaction(&stm_thread_local); + _pypy_stm_initialize_nursery_low_fill_mark(0); + _pypy_stm_inev_state(); errno = e; } } @@ -73,8 +77,6 @@ case 1: pypy_stm_nursery_low_fill_mark = pypy_stm_nursery_low_fill_mark_saved; assert(pypy_stm_nursery_low_fill_mark != (uintptr_t) -1); - assert(!(STM_SEGMENT->jmpbuf_ptr == NULL) || - (pypy_stm_nursery_low_fill_mark == 0)); break; case 0: pypy_stm_ready_atomic = 1; _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit