Author: Armin Rigo <ar...@tunes.org> Branch: marker Changeset: r1163:9568cd489776 Date: 2014-04-18 12:06 +0200 http://bitbucket.org/pypy/stmgc/changeset/9568cd489776/
Log: Tweaks, and check with demo2.c that it's usable from C code diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c --- a/c7/demo/demo2.c +++ b/c7/demo/demo2.c @@ -44,6 +44,14 @@ visit((object_t **)&n->next); } +static void expand_marker(uintptr_t odd_number, + object_t *following_object, + char *outputbuf, size_t outputbufsize) +{ + assert(following_object == NULL); + snprintf(outputbuf, outputbufsize, "<%lu>", odd_number); +} + nodeptr_t global_chained_list; @@ -198,8 +206,18 @@ STM_PUSH_ROOT(stm_thread_local, global_chained_list); /* remains forever in the shadow stack */ + int loops = 0; + while (check_sorted() == -1) { + + STM_PUSH_ROOT(stm_thread_local, (uintptr_t)(2 * loops + 1)); + STM_PUSH_ROOT(stm_thread_local, NULL); + bubble_run(); + + STM_POP_ROOT_RET(stm_thread_local); + STM_POP_ROOT_RET(stm_thread_local); + loops++; } STM_POP_ROOT(stm_thread_local, global_chained_list); @@ -246,6 +264,7 @@ stm_setup(); stm_register_thread_local(&stm_thread_local); + stmcb_expand_marker = expand_marker; setup_list(); diff --git a/c7/stm/marker.c b/c7/stm/marker.c --- a/c7/stm/marker.c +++ b/c7/stm/marker.c @@ -10,7 +10,8 @@ static void marker_fetch_expand(struct stm_priv_segment_info_s *pseg) { - pseg->marker_self[0] = 0; + if (pseg->marker_self[0] != 0) + return; /* already collected an entry */ if (stmcb_expand_marker != NULL) { stm_thread_local_t *tl = pseg->pub.running_thread; @@ -22,6 +23,11 @@ /* the stack entry is an odd number */ stmcb_expand_marker(x, current[1].ss, pseg->marker_self, _STM_MARKER_LEN); + + if (pseg->marker_self[0] == 0) { + pseg->marker_self[0] = '?'; + pseg->marker_self[1] = 0; + } break; } } @@ -40,7 +46,10 @@ earlier than now (some objects may be GCed), but we only know here the total time it gets attributed. */ - tl->longest_marker_state = attribute_to; - tl->longest_marker_time = time; - memcpy(tl->longest_marker_self, pseg->marker_self, _STM_MARKER_LEN); + if (time * 0.99 > tl->longest_marker_time) { + tl->longest_marker_state = attribute_to; + tl->longest_marker_time = time; + memcpy(tl->longest_marker_self, pseg->marker_self, _STM_MARKER_LEN); + } + pseg->marker_self[0] = 0; } diff --git a/c7/stm/timing.c b/c7/stm/timing.c --- a/c7/stm/timing.c +++ b/c7/stm/timing.c @@ -39,8 +39,7 @@ add_timing(tl, attribute_to, time_this_transaction); tl->timing[STM_TIME_RUN_CURRENT] = 0.0f; - if (attribute_to != STM_TIME_RUN_COMMITTED && - time_this_transaction * 0.99 > tl->longest_marker_time) { + if (attribute_to != STM_TIME_RUN_COMMITTED) { struct stm_priv_segment_info_s *pseg = get_priv_segment(STM_SEGMENT->segment_num); marker_copy(tl, pseg, attribute_to, time_this_transaction); @@ -81,6 +80,10 @@ fprintf(stderr, " %-24s %9u %8.3f s\n", timer_names[i], tl->events[i], (double)tl->timing[i]); } + fprintf(stderr, " %-24s %6s %11.6f s\n", + "longest recorded marker", "", tl->longest_marker_time); + fprintf(stderr, " \"%.*s\"\n", + (int)_STM_MARKER_LEN, tl->longest_marker_self); s_mutex_unlock(); } } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit