Author: Armin Rigo <ar...@tunes.org> Branch: finalizer Changeset: r1475:512c75ab693f Date: 2014-10-17 11:59 +0200 http://bitbucket.org/pypy/stmgc/changeset/512c75ab693f/
Log: Tweak invocation of same-transaction finalizers diff --git a/c7/stm/core.c b/c7/stm/core.c --- a/c7/stm/core.c +++ b/c7/stm/core.c @@ -808,6 +808,9 @@ void stm_commit_transaction(void) { + restart_all: + exec_local_finalizers(); + assert(!_has_mutex()); assert(STM_PSEGMENT->safe_point == SP_RUNNING); assert(STM_PSEGMENT->running_pthread == pthread_self()); @@ -825,6 +828,11 @@ Important: we should not call cond_wait() in the meantime. */ synchronize_all_threads(STOP_OTHERS_UNTIL_MUTEX_UNLOCK); + if (any_local_finalizers()) { + s_mutex_unlock(); + goto restart_all; + } + /* detect conflicts */ if (detect_write_read_conflicts()) goto restart; diff --git a/c7/stm/finalizer.c b/c7/stm/finalizer.c --- a/c7/stm/finalizer.c +++ b/c7/stm/finalizer.c @@ -345,9 +345,9 @@ LIST_FREE(_finalizer_emptystack); } -static void execute_finalizers(struct finalizers_s *f) +static void _execute_finalizers(struct finalizers_s *f) { - if (f == NULL || f->run_finalizers == NULL) + if (f->run_finalizers == NULL) return; /* nothing to do */ restart: @@ -395,7 +395,7 @@ stm_rewind_jmp_enterframe(tl, &rjbuf); stm_start_transaction(tl); - execute_finalizers(&g_finalizers); + _execute_finalizers(&g_finalizers); stm_commit_transaction(); stm_rewind_jmp_leaveframe(tl, &rjbuf); diff --git a/c7/stm/finalizer.h b/c7/stm/finalizer.h --- a/c7/stm/finalizer.h +++ b/c7/stm/finalizer.h @@ -37,4 +37,11 @@ _invoke_general_finalizers(tl); \ } while (0) -static void execute_finalizers(struct finalizers_s *f); +static void _execute_finalizers(struct finalizers_s *f); + +#define any_local_finalizers() (STM_PSEGMENT->finalizers != NULL && \ + STM_PSEGMENT->finalizers->run_finalizers != NULL) +#define exec_local_finalizers() do { \ + if (any_local_finalizers()) \ + _execute_finalizers(STM_PSEGMENT->finalizers); \ +} while (0) diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c --- a/c7/stm/gcpage.c +++ b/c7/stm/gcpage.c @@ -153,8 +153,7 @@ } s_mutex_unlock(); - - execute_finalizers(STM_PSEGMENT->finalizers); + exec_local_finalizers(); } diff --git a/c7/stm/sync.c b/c7/stm/sync.c --- a/c7/stm/sync.c +++ b/c7/stm/sync.c @@ -228,6 +228,7 @@ assert(_stm_in_transaction(tl)); set_gs_register(get_segment_base(tl->associated_segment_num)); assert(STM_SEGMENT->running_thread == tl); + exec_local_finalizers(); } #if STM_TESTS diff --git a/c7/test/test_finalizer.py b/c7/test/test_finalizer.py --- a/c7/test/test_finalizer.py +++ b/c7/test/test_finalizer.py @@ -167,3 +167,18 @@ self.expect_finalized([]) self.commit_transaction() self.expect_finalized([lp1]) + + def test_run_cb_for_all_threads(self): + self.start_transaction() + lp1 = stm_allocate_with_finalizer(48) + print lp1 + # + self.switch(1) + self.start_transaction() + lp2 = stm_allocate_with_finalizer(56) + print lp2 + + self.expect_finalized([]) + stm_major_collect() + self.switch(0) + self.expect_finalized([lp2, lp1]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit