Author: Armin Rigo <ar...@tunes.org>
Branch: c7-refactor
Changeset: r814:9a45fb18c2da
Date: 2014-02-23 15:29 +0100
http://bitbucket.org/pypy/stmgc/changeset/9a45fb18c2da/

Log:    Fixes for the test.

diff --git a/c7/stm/misc.c b/c7/stm/misc.c
--- a/c7/stm/misc.c
+++ b/c7/stm/misc.c
@@ -52,3 +52,24 @@
 {
     return ((stm_creation_marker_t *)(((uintptr_t)obj) >> 8))->cm;
 }
+
+#ifdef STM_TESTS
+object_t *_stm_enum_old_objects_pointing_to_young(void)
+{
+    static long index = 0;
+    struct list_s *lst = STM_PSEGMENT->old_objects_pointing_to_young;
+    if (index < list_count(lst))
+        return (object_t *)list_item(lst, index++);
+    index = 0;
+    return (object_t *)-1;
+}
+object_t *_stm_enum_modified_objects(void)
+{
+    static long index = 0;
+    struct list_s *lst = STM_PSEGMENT->modified_objects;
+    if (index < list_count(lst))
+        return (object_t *)list_item(lst, index++);
+    index = 0;
+    return (object_t *)-1;
+}
+#endif
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -159,6 +159,7 @@
 
         /* Copy the object to segment 0 (as a first step) */
         memcpy(copyobj, realobj, size);
+        ((struct object_s *)copyobj)->stm_flags |= GCFLAG_WRITE_BARRIER_CALLED;
 
         nobj = (object_t *)(copyobj - stm_object_pages);
 
@@ -193,6 +194,8 @@
             for (i = 1; i < NB_SEGMENTS; i++) {
                 uintptr_t diff = get_segment_base(i) - stm_object_pages;
                 memcpy(copyobj + diff, realobj + diff, size);
+                ((struct object_s *)(copyobj + diff))->stm_flags |=
+                    GCFLAG_WRITE_BARRIER_CALLED;
             }
         }
 
@@ -224,6 +227,7 @@
     }
 
     /* Done copying the object. */
+    //dprintf(("%p -> %p\n", obj, nobj));
     pforwarded_array[0] = GCWORD_MOVED;
     pforwarded_array[1] = nobj;
     *pobj = nobj;
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -98,6 +98,8 @@
 void _stm_start_safe_point(void);
 void _stm_stop_safe_point(void);
 void _stm_set_nursery_free_count(uint64_t free_count);
+object_t *_stm_enum_old_objects_pointing_to_young(void);
+object_t *_stm_enum_modified_objects(void);
 #endif
 
 #define _STM_GCFLAG_WRITE_BARRIER_CALLED  0x80
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -76,50 +76,12 @@
 void _stm_set_nursery_free_count(uint64_t free_count);
 
 ssize_t stmcb_size_rounded_up(struct object_s *obj);
+
+object_t *_stm_enum_old_objects_pointing_to_young(void);
+object_t *_stm_enum_modified_objects(void);
 """)
 
 
-TEMPORARILY_DISABLED = """
-void stm_start_inevitable_transaction(stm_thread_local_t *tl);
-
-void _stm_minor_collect();
-
-void *memset(void *s, int c, size_t n);
-extern size_t stmcb_size(struct object_s *);
-extern void stmcb_trace(struct object_s *, void (object_t **));
-
-uint8_t _stm_get_flags(object_t *obj);
-uint8_t stm_get_page_flag(int pagenum);
-enum {
-    SHARED_PAGE=0,
-    REMAPPING_PAGE,
-    PRIVATE_PAGE,
-};  /* flag_page_private */
-
-enum {
-    GCFLAG_WRITE_BARRIER = 1,
-    GCFLAG_NOT_COMMITTED = 2,
-    GCFLAG_MOVED = 4,
-};
-
-void stm_largemalloc_init(char *data_start, size_t data_size);
-int stm_largemalloc_resize_arena(size_t new_size);
-
-object_t *stm_large_malloc(size_t request_size);
-void stm_large_free(object_t *data);
-
-void _stm_large_dump(void);
-char *_stm_largemalloc_data_start(void);
-
-void _stm_move_object(object_t* obj, char *src, char *dst);
-size_t _stm_data_size(struct object_s *data);
-void _stm_chunk_pages(struct object_s *data, uintptr_t *start, uintptr_t *num);
-
-void stm_become_inevitable(char* msg);
-void stm_start_inevitable_transaction();
-"""
-
-
 lib = ffi.verify('''
 #include <stdlib.h>
 #include <string.h>
@@ -222,6 +184,9 @@
 
 void _set_ptr(object_t *obj, int n, object_t *v)
 {
+    int nrefs = ((myobj_t*)obj)->type_id - 421420;
+    assert(n < nrefs);
+
     stm_char *field_addr = ((stm_char*)obj);
     field_addr += SIZEOF_MYOBJ; /* header */
     field_addr += n * sizeof(void*); /* field */
@@ -231,6 +196,9 @@
 
 object_t * _get_ptr(object_t *obj, int n)
 {
+    int nrefs = ((myobj_t*)obj)->type_id - 421420;
+    assert(n < nrefs);
+
     stm_char *field_addr = ((stm_char*)obj);
     field_addr += SIZEOF_MYOBJ; /* header */
     field_addr += n * sizeof(void*); /* field */
@@ -396,6 +364,15 @@
 def stm_get_flags(o):
     return lib._stm_get_flags(o)
 
+def old_objects_pointing_to_young():
+    return list(iter(lib._stm_enum_old_objects_pointing_to_young,
+                     ffi.cast("object_t *", -1)))
+
+def modified_objects():
+    return list(iter(lib._stm_enum_modified_objects,
+                     ffi.cast("object_t *", -1)))
+
+
 SHADOWSTACK_LENGTH = 100
 _keepalive = weakref.WeakKeyDictionary()
 
diff --git a/c7/test/test_basic.py b/c7/test/test_basic.py
--- a/c7/test/test_basic.py
+++ b/c7/test/test_basic.py
@@ -50,6 +50,7 @@
         assert stm_was_written(lp1)
         stm_write(lp1)
         assert stm_was_written(lp1)
+        assert modified_objects() == []    # because same transaction
         self.commit_transaction()
 
     def test_allocate_old(self):
@@ -83,7 +84,9 @@
         #
         self.switch(1)
         self.start_transaction()
+        assert modified_objects() == []
         stm_write(lp1)
+        assert modified_objects() == [lp1]
         assert stm_get_char(lp1) == 'a'
         stm_set_char(lp1, 'b')
         #
diff --git a/c7/test/test_nursery.py b/c7/test/test_nursery.py
--- a/c7/test/test_nursery.py
+++ b/c7/test/test_nursery.py
@@ -66,20 +66,41 @@
         # make a long, ever-growing linked list of objects, in one transaction
         lib._stm_set_nursery_free_count(NURSERY_SECTION_SIZE * 2)
         self.start_transaction()
-        lp1 = stm_allocate(16)
+        lp1 = stm_allocate_refs(1)
         self.push_root(lp1)
-        lp2 = lp1
-        N = (NURSERY_SECTION_SIZE * 5) / 16
+        prev = lp1
+        prevprev = None
+        FIT = (NURSERY_SECTION_SIZE * 2) / 16 - 1   # without 'lp1' above
+        N = (NURSERY_SECTION_SIZE * 4) / 16 + 41
         for i in range(N):
-            self.push_root(lp2)
-            lp3 = stm_allocate(16)
-            lp2 = self.pop_root()
-            stm_set_ref(lp2, 0, lp3)
-            lp2 = lp3
+            if prevprev:
+                assert stm_get_ref(prevprev, 0) == prev
+                self.push_root(prevprev)
+            self.push_root(prev)
+            lp3 = stm_allocate_refs(1)
+            prev = self.pop_root()
+            if prevprev:
+                prevprev = self.pop_root()
+                assert prevprev != prev
+            stm_set_ref(prev, 0, lp3)
+            prevprev = prev
+            prev = lp3
+
+            seeme = old_objects_pointing_to_young()
+            if i < FIT:
+                assert len(seeme) == 0    # no minor collection so far
+            else:
+                assert len(seeme) == 1    # the one from the prev minor coll
+
         lp1 = self.pop_root()
+        assert modified_objects() == []
+
         lp2 = lp1
         for i in range(N):
             assert lp2
+            assert stm_creation_marker(lp2) == (0xff if is_in_nursery(lp2)
+                                                     else 0x01)
+            prev = lp2
             lp2 = stm_get_ref(lp2, 0)
         assert lp2 == lp3
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to