Author: Armin Rigo <ar...@tunes.org> Branch: marker Changeset: r1189:6b462cb2ba16 Date: 2014-04-28 18:04 +0200 http://bitbucket.org/pypy/stmgc/changeset/6b462cb2ba16/
Log: Find out how to reuse the logic. diff --git a/c7/stm/contention.c b/c7/stm/contention.c --- a/c7/stm/contention.c +++ b/c7/stm/contention.c @@ -187,7 +187,7 @@ dprintf(("abort in contention\n")); STM_SEGMENT->nursery_end = abort_category; - marker_contention_abort_self(abort_category, other_segment_num, obj); + marker_contention(abort_category, false, other_segment_num, obj); abort_with_mutex(); } @@ -195,10 +195,7 @@ /* We have to signal the other thread to abort, and wait until it does. */ contmgr.other_pseg->pub.nursery_end = abort_category; - if (kind == WRITE_WRITE_CONTENTION) { - //marker_fetch_obj_write(contmgr.other_pseg->pub.segment_num, - // obj, contmgr.other_pseg->...); - } + marker_contention(abort_category, true, other_segment_num, obj); int sp = contmgr.other_pseg->safe_point; switch (sp) { diff --git a/c7/stm/marker.c b/c7/stm/marker.c --- a/c7/stm/marker.c +++ b/c7/stm/marker.c @@ -134,9 +134,8 @@ marker[1] = 0; } -static void marker_contention_abort_self(int category, - uint8_t other_segment_num, - object_t *obj) +static void marker_contention(int category, bool abort_other, + uint8_t other_segment_num, object_t *obj) { uintptr_t self_marker[2]; uintptr_t other_marker[2]; @@ -148,25 +147,30 @@ char *my_segment_base = STM_SEGMENT->segment_base; char *other_segment_base = get_segment_base(other_segment_num); - /* I'm aborting. Collect the location for myself. It's usually - the current location, except in a write-read abort, in which - case it's the older location of the write. */ + acquire_marker_lock(other_segment_base); + + /* Collect the location for myself. It's usually the current + location, except in a write-read abort, in which case it's the + older location of the write. */ if (category == STM_TIME_RUN_ABORTED_WRITE_READ) marker_fetch_obj_write(my_pseg->pub.segment_num, obj, self_marker); else marker_fetch(my_pseg->pub.running_thread, self_marker); - marker_expand(self_marker, my_segment_base, my_pseg->marker_self); + /* Expand this location into either my_pseg->marker_self or + other_pseg->marker_other, depending on who aborts. */ + marker_expand(self_marker, my_segment_base, + abort_other ? other_pseg->marker_other + : my_pseg->marker_self); /* For some categories, we can also collect the relevant information for the other segment. */ - acquire_marker_lock(other_segment_base); - switch (category) { case STM_TIME_RUN_ABORTED_WRITE_WRITE: marker_fetch_obj_write(other_segment_num, obj, other_marker); break; case STM_TIME_RUN_ABORTED_INEVITABLE: + assert(abort_other == false); other_marker[0] = other_pseg->marker_inev[0]; other_marker[1] = other_pseg->marker_inev[1]; break; @@ -176,7 +180,16 @@ break; } - marker_expand(other_marker, other_segment_base, my_pseg->marker_other); + marker_expand(other_marker, other_segment_base, + abort_other ? other_pseg->marker_self + : my_pseg->marker_other); + + if (abort_other && other_pseg->marker_self[0] == 0) { + if (category == STM_TIME_RUN_ABORTED_WRITE_READ) + strcpy(other_pseg->marker_self, "<read at unknown location>"); + else + strcpy(other_pseg->marker_self, "<no location information>"); + } release_marker_lock(other_segment_base); } diff --git a/c7/stm/marker.h b/c7/stm/marker.h --- a/c7/stm/marker.h +++ b/c7/stm/marker.h @@ -8,6 +8,5 @@ struct stm_priv_segment_info_s *pseg, enum stm_time_e attribute_to, double time); -static void marker_contention_abort_self(int category, - uint8_t other_segment_num, - object_t *obj); +static void marker_contention(int category, bool abort_other, + uint8_t other_segment_num, object_t *obj); _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit