Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r1861:5b75b3f3a9b7 Date: 2015-06-18 17:01 +0200 http://bitbucket.org/pypy/stmgc/changeset/5b75b3f3a9b7/
Log: tweaks diff --git a/c8/stm/core.c b/c8/stm/core.c --- a/c8/stm/core.c +++ b/c8/stm/core.c @@ -529,7 +529,7 @@ enter_safe_point_if_requested(); } else if (STM_PSEGMENT->last_commit_log_entry->next == INEV_RUNNING) { - cond_wait(C_SEGMENT_FREE_OR_SAFE_POINT); + cond_wait(C_SEGMENT_FREE_OR_SAFE_POINT_REQ); } s_mutex_unlock(); goto retry_from_start; /* redo _stm_validate() now */ @@ -1119,7 +1119,7 @@ { assert(!_stm_in_transaction(tl)); - while (!acquire_thread_segment(tl)) {} + acquire_thread_segment(tl); /* GS invalid before this point! */ assert(STM_PSEGMENT->safe_point == SP_NO_TRANSACTION); @@ -1567,7 +1567,7 @@ s_mutex_lock(); if (any_soon_finished_or_inevitable_thread_segment() && !safe_point_requested()) { - cond_wait(C_SEGMENT_FREE_OR_SAFE_POINT); + cond_wait(C_SEGMENT_FREE_OR_SAFE_POINT_REQ); } s_mutex_unlock(); num_waits++; diff --git a/c8/stm/sync.c b/c8/stm/sync.c --- a/c8/stm/sync.c +++ b/c8/stm/sync.c @@ -188,10 +188,11 @@ #endif -static bool acquire_thread_segment(stm_thread_local_t *tl) +static void acquire_thread_segment(stm_thread_local_t *tl) { /* This function acquires a segment for the currently running thread, and set up the GS register if it changed. */ + retry_from_start: assert(_has_mutex()); assert(_is_tl_registered(tl)); @@ -225,13 +226,13 @@ } } /* No segment available. Wait until release_thread_segment() - signals that one segment has been freed. */ + signals that one segment has been freed. Note that we prefer + waiting rather than detaching an inevitable transaction, here. */ timing_event(tl, STM_WAIT_FREE_SEGMENT); cond_wait(C_SEGMENT_FREE); timing_event(tl, STM_WAIT_DONE); - /* Return false to the caller, which will call us again */ - return false; + goto retry_from_start; got_num: OPT_ASSERT(num >= 0 && num < NB_SEGMENTS-1); @@ -242,7 +243,6 @@ assert(!in_transaction(tl)); STM_SEGMENT->running_thread = tl; assert(in_transaction(tl)); - return true; } static void release_thread_segment(stm_thread_local_t *tl) @@ -251,7 +251,7 @@ assert(_has_mutex()); cond_signal(C_SEGMENT_FREE); - cond_broadcast(C_SEGMENT_FREE_OR_SAFE_POINT); /* often no listener */ + cond_broadcast(C_SEGMENT_FREE_OR_SAFE_POINT_REQ); /* often no listener */ assert(STM_SEGMENT->running_thread == tl); segnum = STM_SEGMENT->segment_num; @@ -347,7 +347,7 @@ assert(!pause_signalled); pause_signalled = true; dprintf(("request to pause\n")); - cond_broadcast(C_SEGMENT_FREE_OR_SAFE_POINT); + cond_broadcast(C_SEGMENT_FREE_OR_SAFE_POINT_REQ); } static inline long count_other_threads_sp_running(void) diff --git a/c8/stm/sync.h b/c8/stm/sync.h --- a/c8/stm/sync.h +++ b/c8/stm/sync.h @@ -5,7 +5,7 @@ C_AT_SAFE_POINT, C_REQUEST_REMOVED, C_SEGMENT_FREE, - C_SEGMENT_FREE_OR_SAFE_POINT, + C_SEGMENT_FREE_OR_SAFE_POINT_REQ, _C_TOTAL }; @@ -23,7 +23,7 @@ /* acquire and release one of the segments for running the given thread (must have the mutex acquired!) */ -static bool acquire_thread_segment(stm_thread_local_t *tl); +static void acquire_thread_segment(stm_thread_local_t *tl); static void release_thread_segment(stm_thread_local_t *tl); static void soon_finished_or_inevitable_thread_segment(void); static bool any_soon_finished_or_inevitable_thread_segment(void); _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit