Author: Armin Rigo <ar...@tunes.org> Branch: marker Changeset: r1191:4bde66e3b621 Date: 2014-04-28 18:36 +0200 http://bitbucket.org/pypy/stmgc/changeset/4bde66e3b621/
Log: Report markers for forced pauses. Seems to work but hard to test for now... diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c --- a/c7/demo/demo2.c +++ b/c7/demo/demo2.c @@ -51,7 +51,7 @@ char *outputbuf, size_t outputbufsize) { assert(following_object == NULL); - snprintf(outputbuf, outputbufsize, "<%lu>", odd_number); + snprintf(outputbuf, outputbufsize, "<%p %lu>", base, odd_number); } @@ -98,6 +98,18 @@ STM_START_TRANSACTION(&stm_thread_local, here); + if (stm_thread_local.longest_marker_state != 0) { + fprintf(stderr, "[%p] marker %d for %.6f seconds:\n", + &stm_thread_local, + stm_thread_local.longest_marker_state, + stm_thread_local.longest_marker_time); + fprintf(stderr, "\tself:\t\"%s\"\n\tother:\t\"%s\"\n", + stm_thread_local.longest_marker_self, + stm_thread_local.longest_marker_other); + stm_thread_local.longest_marker_state = 0; + stm_thread_local.longest_marker_time = 0.0; + } + nodeptr_t prev = initial; stm_read((objptr_t)prev); diff --git a/c7/stm/contention.c b/c7/stm/contention.c --- a/c7/stm/contention.c +++ b/c7/stm/contention.c @@ -162,6 +162,7 @@ itself already paused here. */ contmgr.other_pseg->signal_when_done = true; + marker_contention(kind, false, other_segment_num, obj); change_timing_state(wait_category); @@ -178,7 +179,13 @@ if (must_abort()) abort_with_mutex(); - change_timing_state(STM_TIME_RUN_CURRENT); + struct stm_priv_segment_info_s *pseg = + get_priv_segment(STM_SEGMENT->segment_num); + double elapsed = + change_timing_state_tl(pseg->pub.running_thread, + STM_TIME_RUN_CURRENT); + marker_copy(pseg->pub.running_thread, pseg, + wait_category, elapsed); } else if (!contmgr.abort_other) { @@ -187,7 +194,7 @@ dprintf(("abort in contention\n")); STM_SEGMENT->nursery_end = abort_category; - marker_contention(abort_category, false, other_segment_num, obj); + marker_contention(kind, false, other_segment_num, obj); abort_with_mutex(); } @@ -195,7 +202,7 @@ /* We have to signal the other thread to abort, and wait until it does. */ contmgr.other_pseg->pub.nursery_end = abort_category; - marker_contention(abort_category, true, other_segment_num, obj); + marker_contention(kind, 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,7 +134,7 @@ marker[1] = 0; } -static void marker_contention(int category, bool abort_other, +static void marker_contention(int kind, bool abort_other, uint8_t other_segment_num, object_t *obj) { uintptr_t self_marker[2]; @@ -152,7 +152,7 @@ /* 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) + if (kind == WRITE_READ_CONTENTION) marker_fetch_obj_write(my_pseg->pub.segment_num, obj, self_marker); else marker_fetch(my_pseg->pub.running_thread, self_marker); @@ -165,11 +165,11 @@ /* For some categories, we can also collect the relevant information for the other segment. */ - switch (category) { - case STM_TIME_RUN_ABORTED_WRITE_WRITE: + switch (kind) { + case WRITE_WRITE_CONTENTION: marker_fetch_obj_write(other_segment_num, obj, other_marker); break; - case STM_TIME_RUN_ABORTED_INEVITABLE: + case INEVITABLE_CONTENTION: assert(abort_other == false); other_marker[0] = other_pseg->marker_inev[0]; other_marker[1] = other_pseg->marker_inev[1]; @@ -185,7 +185,7 @@ : my_pseg->marker_other); if (abort_other && other_pseg->marker_self[0] == 0) { - if (category == STM_TIME_RUN_ABORTED_WRITE_READ) + if (kind == WRITE_READ_CONTENTION) strcpy(other_pseg->marker_self, "<read at unknown location>"); else strcpy(other_pseg->marker_self, "<no location information>"); diff --git a/c7/stm/marker.h b/c7/stm/marker.h --- a/c7/stm/marker.h +++ b/c7/stm/marker.h @@ -8,5 +8,5 @@ struct stm_priv_segment_info_s *pseg, enum stm_time_e attribute_to, double time); -static void marker_contention(int category, bool abort_other, +static void marker_contention(int kind, bool abort_other, uint8_t other_segment_num, object_t *obj); diff --git a/c7/stm/timing.c b/c7/stm/timing.c --- a/c7/stm/timing.c +++ b/c7/stm/timing.c @@ -25,10 +25,11 @@ return oldstate; } -static void change_timing_state_tl(stm_thread_local_t *tl, - enum stm_time_e newstate) +static double change_timing_state_tl(stm_thread_local_t *tl, + enum stm_time_e newstate) { TIMING_CHANGE(tl, newstate); + return elasped; } static void timing_end_transaction(enum stm_time_e attribute_to) diff --git a/c7/stm/timing.h b/c7/stm/timing.h --- a/c7/stm/timing.h +++ b/c7/stm/timing.h @@ -8,7 +8,7 @@ } static enum stm_time_e change_timing_state(enum stm_time_e newstate); -static void change_timing_state_tl(stm_thread_local_t *tl, - enum stm_time_e newstate); +static double change_timing_state_tl(stm_thread_local_t *tl, + enum stm_time_e newstate); static void timing_end_transaction(enum stm_time_e attribute_to); _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit