Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r916:dac6b73eede4
Date: 2014-03-01 22:57 +0100
http://bitbucket.org/pypy/stmgc/changeset/dac6b73eede4/

Log:    Fixes until all tests seem to pass.

diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -3,6 +3,9 @@
 #endif
 
 
+static struct list_s *testing_prebuilt_objs = NULL;
+
+
 static void setup_gcpage(void)
 {
     char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL;
@@ -17,6 +20,7 @@
 {
     memset(small_alloc, 0, sizeof(small_alloc));
     free_uniform_pages = NULL;
+    LIST_FREE(testing_prebuilt_objs);
 }
 
 
@@ -95,8 +99,6 @@
     return addr;
 }
 
-static struct list_s *testing_prebuilt_objs = NULL;
-
 object_t *_stm_allocate_old(ssize_t size_rounded_up)
 {
     /* only for tests */
@@ -198,11 +200,8 @@
     LIST_APPEND(mark_objects_to_trace, obj);
 }
 
-static void mark_from_object(object_t *obj, char *segment_base)
+static void mark_trace(object_t *obj, char *segment_base)
 {
-    if (obj == NULL || mark_visited_test_and_set(obj))
-        return;
-
     assert(list_is_empty(mark_objects_to_trace));
 
     while (1) {
@@ -217,6 +216,13 @@
     }
 }
 
+static inline void mark_visit_object(object_t *obj, char *segment_base)
+{
+    if (obj == NULL || mark_visited_test_and_set(obj))
+        return;
+    mark_trace(obj, segment_base);
+}
+
 static void mark_visit_from_roots(void)
 {
     stm_thread_local_t *tl = stm_all_thread_locals;
@@ -232,16 +238,16 @@
         object_t **base = tl->shadowstack_base;
         while (current-- != base) {
             assert(*current != (object_t *)-1);
-            mark_from_object(*current, segment_base);
+            mark_visit_object(*current, segment_base);
         }
-        mark_from_object(tl->thread_local_obj, segment_base);
+        mark_visit_object(tl->thread_local_obj, segment_base);
 
         tl = tl->next;
     } while (tl != stm_all_thread_locals);
 
     if (testing_prebuilt_objs != NULL) {
         LIST_FOREACH_R(testing_prebuilt_objs, object_t * /*item*/,
-                       mark_from_object(item, get_segment_base(0)));
+                       mark_visit_object(item, get_segment_base(0)));
     }
 }
 
@@ -259,8 +265,9 @@
             get_priv_segment(i)->modified_old_objects,
             object_t * /*item*/,
             ({
-                mark_from_object(item, base1);
-                mark_from_object(item, base2);
+                mark_visited_test_and_set(item);
+                mark_trace(item, base1);
+                mark_trace(item, base2);
             }));
     }
 }
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -324,13 +324,6 @@
 def stm_was_written(o):
     return lib._stm_was_written(o)
 
-def stm_creation_marker(o):
-    return lib._stm_creation_marker(o)
-
-def stm_stop_transaction():
-    if lib._stm_stop_transaction():
-        raise Conflict()
-
 
 def stm_start_safe_point():
     lib._stm_start_safe_point()
diff --git a/c7/test/test_random.py b/c7/test/test_random.py
--- a/c7/test/test_random.py
+++ b/c7/test/test_random.py
@@ -164,7 +164,9 @@
     def pop_roots(self, ex):
         for r in reversed(self.saved_roots[self.roots_on_transaction_start:]):
             ex.do('%s = self.pop_root()' % r)
-            ex.do('# 0x%x' % (int(ffi.cast("uintptr_t", ex.content[r])),))
+            ex.do('# 0x%x, size %d' % (
+                int(ffi.cast("uintptr_t", ex.content[r])),
+                stm_get_obj_size(ex.content[r])))
             self.roots_on_stack -= 1
         assert self.roots_on_stack == self.roots_on_transaction_start
 
@@ -176,8 +178,9 @@
             for r in reversed(to_reload):
                 ex.do('%s = self.pop_root()' % r)
             for r in to_reload:
-                ex.do('self.push_root(%s)  # 0x%x' % (
-                    r, int(ffi.cast("uintptr_t", ex.content[r]))))
+                ex.do('self.push_root(%s)  # 0x%x, size %d' % (
+                    r, int(ffi.cast("uintptr_t", ex.content[r])),
+                    stm_get_obj_size(ex.content[r])))
 
     def start_transaction(self):
         assert self.transaction_state is None
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to