[pypy-commit] pypy stmgc-c7: import stmgc/918b1901b1f9
arigo
noreply at buildbot.pypy.org
Wed Apr 16 17:40:10 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r70662:4ca36098b3de
Date: 2014-04-16 17:31 +0200
http://bitbucket.org/pypy/pypy/changeset/4ca36098b3de/
Log: import stmgc/918b1901b1f9
diff --git a/rpython/translator/stm/src_stm/revision b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-a158a889e78b
+918b1901b1f9
diff --git a/rpython/translator/stm/src_stm/stm/gcpage.c b/rpython/translator/stm/src_stm/stm/gcpage.c
--- a/rpython/translator/stm/src_stm/stm/gcpage.c
+++ b/rpython/translator/stm/src_stm/stm/gcpage.c
@@ -380,8 +380,8 @@
struct stm_shadowentry_s *current = tl->shadowstack;
struct stm_shadowentry_s *base = tl->shadowstack_base;
while (current-- != base) {
- assert(current->ss != (object_t *)-1);
- mark_visit_object(current->ss, segment_base);
+ if (((uintptr_t)current->ss) > STM_STACK_MARKER_OLD)
+ mark_visit_object(current->ss, segment_base);
}
mark_visit_object(tl->thread_local_obj, segment_base);
diff --git a/rpython/translator/stm/src_stm/stm/nursery.c b/rpython/translator/stm/src_stm/stm/nursery.c
--- a/rpython/translator/stm/src_stm/stm/nursery.c
+++ b/rpython/translator/stm/src_stm/stm/nursery.c
@@ -157,10 +157,32 @@
stm_thread_local_t *tl = STM_SEGMENT->running_thread;
struct stm_shadowentry_s *current = tl->shadowstack;
struct stm_shadowentry_s *base = tl->shadowstack_base;
- while (current-- != base) {
- assert(current->ss != (object_t *)-1);
- minor_trace_if_young(¤t->ss);
+ while (1) {
+ --current;
+ OPT_ASSERT(current >= base);
+
+ switch ((uintptr_t)current->ss) {
+
+ case 0: /* NULL */
+ continue;
+
+ case STM_STACK_MARKER_NEW:
+ /* the marker was not already seen: mark it as seen,
+ but continue looking more deeply in the shadowstack */
+ current->ss = (object_t *)STM_STACK_MARKER_OLD;
+ continue;
+
+ case STM_STACK_MARKER_OLD:
+ /* the marker was already seen: we can stop the
+ root stack tracing at this point */
+ goto interrupt;
+
+ default:
+ /* the stack entry is a regular pointer */
+ minor_trace_if_young(¤t->ss);
+ }
}
+ interrupt:
minor_trace_if_young(&tl->thread_local_obj);
}
diff --git a/rpython/translator/stm/src_stm/stm/setup.c b/rpython/translator/stm/src_stm/stm/setup.c
--- a/rpython/translator/stm/src_stm/stm/setup.c
+++ b/rpython/translator/stm/src_stm/stm/setup.c
@@ -154,11 +154,13 @@
struct stm_shadowentry_s *s = (struct stm_shadowentry_s *)start;
tl->shadowstack = s;
tl->shadowstack_base = s;
+ STM_PUSH_ROOT(*tl, STM_STACK_MARKER_OLD);
}
static void _done_shadow_stack(stm_thread_local_t *tl)
{
- assert(tl->shadowstack >= tl->shadowstack_base);
+ assert(tl->shadowstack > tl->shadowstack_base);
+ assert(tl->shadowstack_base->ss == (object_t *)STM_STACK_MARKER_OLD);
char *start = (char *)tl->shadowstack_base;
_shadowstack_trap_page(start, PROT_READ | PROT_WRITE);
diff --git a/rpython/translator/stm/src_stm/stm/timing.c b/rpython/translator/stm/src_stm/stm/timing.c
--- a/rpython/translator/stm/src_stm/stm/timing.c
+++ b/rpython/translator/stm/src_stm/stm/timing.c
@@ -71,7 +71,7 @@
s_mutex_lock();
fprintf(stderr, "thread %p:\n", tl);
for (i = 0; i < _STM_TIME_N; i++) {
- fprintf(stderr, " %-24s %9u %.3f s\n",
+ fprintf(stderr, " %-24s %9u %8.3f s\n",
timer_names[i], tl->events[i], (double)tl->timing[i]);
}
s_mutex_unlock();
diff --git a/rpython/translator/stm/src_stm/stmgc.h b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -265,6 +265,8 @@
#define STM_PUSH_ROOT(tl, p) ((tl).shadowstack++->ss = (object_t *)(p))
#define STM_POP_ROOT(tl, p) ((p) = (typeof(p))((--(tl).shadowstack)->ss))
#define STM_POP_ROOT_RET(tl) ((--(tl).shadowstack)->ss)
+#define STM_STACK_MARKER_NEW 1
+#define STM_STACK_MARKER_OLD 2
/* Every thread needs to have a corresponding stm_thread_local_t
More information about the pypy-commit
mailing list