[pypy-commit] pypy stmgc-c7: import stmgc/ddbc16971682

arigo noreply at buildbot.pypy.org
Sat Mar 15 11:20:34 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r69972:1d0b870195e7
Date: 2014-03-15 11:11 +0100
http://bitbucket.org/pypy/pypy/changeset/1d0b870195e7/

Log:	import stmgc/ddbc16971682

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 @@
-7f6e7192dd38
+ddbc16971682
diff --git a/rpython/translator/stm/src_stm/stm/core.h b/rpython/translator/stm/src_stm/stm/core.h
--- a/rpython/translator/stm/src_stm/stm/core.h
+++ b/rpython/translator/stm/src_stm/stm/core.h
@@ -151,7 +151,7 @@
 
     /* In case of abort, we restore the 'shadowstack' field and the
        'thread_local_obj' field. */
-    object_t **shadowstack_at_start_of_transaction;
+    struct stm_shadowentry_s *shadowstack_at_start_of_transaction;
     object_t *threadlocal_at_start_of_transaction;
 
     /* For debugging */
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
@@ -398,11 +398,11 @@
 
             if (must_be_zero == (segment_base == get_segment_base(0))) {
 
-                object_t **current = tl->shadowstack;
-                object_t **base = tl->shadowstack_base;
+                struct stm_shadowentry_s *current = tl->shadowstack;
+                struct stm_shadowentry_s *base = tl->shadowstack_base;
                 while (current-- != base) {
-                    assert(*current != (object_t *)-1);
-                    mark_visit_object(*current, segment_base);
+                    assert(current->ss != (object_t *)-1);
+                    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
@@ -159,11 +159,11 @@
 static void collect_roots_in_nursery(void)
 {
     stm_thread_local_t *tl = STM_SEGMENT->running_thread;
-    object_t **current = tl->shadowstack;
-    object_t **base = tl->shadowstack_base;
+    struct stm_shadowentry_s *current = tl->shadowstack;
+    struct stm_shadowentry_s *base = tl->shadowstack_base;
     while (current-- != base) {
-        assert(*current != (object_t *)-1);
-        minor_trace_if_young(current);
+        assert(current->ss != (object_t *)-1);
+        minor_trace_if_young(&current->ss);
     }
     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
@@ -119,7 +119,8 @@
 
 void _init_shadow_stack(stm_thread_local_t *tl)
 {
-    object_t **s = (object_t **)malloc(SHADOW_STACK_SIZE * sizeof(object_t *));
+    struct stm_shadowentry_s *s = (struct stm_shadowentry_s *)
+        malloc(SHADOW_STACK_SIZE * sizeof(struct stm_shadowentry_s));
     assert(s);
     tl->shadowstack = s;
     tl->shadowstack_base = s;
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
@@ -49,9 +49,15 @@
 };
 #define STM_SEGMENT           ((stm_segment_info_t *)4352)
 
+struct stm_shadowentry_s {
+    /* Like stm_read_marker_s, this is a struct to enable better
+       aliasing analysis in the C code. */
+    object_t *ss;
+};
+
 typedef struct stm_thread_local_s {
     /* every thread should handle the shadow stack itself */
-    object_t **shadowstack, **shadowstack_base;
+    struct stm_shadowentry_s *shadowstack, *shadowstack_base;
     /* a generic optional thread-local object */
     object_t *thread_local_obj;
     /* in case this thread runs a transaction that aborts,
@@ -219,9 +225,9 @@
 
 /* Push and pop roots from/to the shadow stack. Only allowed inside
    transaction. */
-#define STM_PUSH_ROOT(tl, p)   (*((tl).shadowstack++) = (object_t *)(p))
-#define STM_POP_ROOT(tl, p)    ((p) = (typeof(p))*(--(tl).shadowstack))
-#define STM_POP_ROOT_RET(tl)   (*(--(tl).shadowstack))
+#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)
 
 
 /* Every thread needs to have a corresponding stm_thread_local_t
diff --git a/rpython/translator/stm/test/richards.py b/rpython/translator/stm/test/richards.py
--- a/rpython/translator/stm/test/richards.py
+++ b/rpython/translator/stm/test/richards.py
@@ -433,7 +433,7 @@
 
 if __name__ == '__main__':
     import sys
-    max_num_threads = 5
+    max_num_threads = 2
     if len(sys.argv) > 1:
         iterations = int(sys.argv[1])
         if len(sys.argv) > 2:


More information about the pypy-commit mailing list