[pypy-commit] stmgc c7-refactor: Passing test

arigo noreply at buildbot.pypy.org
Mon Feb 24 16:40:17 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: c7-refactor
Changeset: r833:5434c22f9999
Date: 2014-02-24 16:40 +0100
http://bitbucket.org/pypy/stmgc/changeset/5434c22f9999/

Log:	Passing test

diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c
--- a/c7/demo/demo2.c
+++ b/c7/demo/demo2.c
@@ -164,9 +164,11 @@
 
     stm_commit_transaction();
 
+    stm_start_inevitable_transaction(&stm_thread_local);
     POP_ROOT(global_chained_list);   /* update value */
     assert(global_chained_list->value == -1);
     PUSH_ROOT(global_chained_list);  /* remains forever in the shadow stack */
+    stm_commit_transaction();
 
     printf("setup ok\n");
 }
diff --git a/c7/stm/misc.c b/c7/stm/misc.c
--- a/c7/stm/misc.c
+++ b/c7/stm/misc.c
@@ -13,15 +13,9 @@
     return REAL_ADDRESS(STM_SEGMENT->segment_base, o);
 }
 
-object_t *_stm_segment_address(char *ptr)
+char *_stm_get_segment_base(long index)
 {
-    if (ptr == NULL)
-        return NULL;
-
-    uintptr_t res = ptr - STM_SEGMENT->segment_base;
-    assert(FIRST_OBJECT_PAGE * 4096UL <= res
-           && res < NB_PAGES * 4096UL);
-    return (object_t*)res;
+    return get_segment_base(index);
 }
 
 struct stm_priv_segment_info_s *_stm_segment(void)
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -74,7 +74,7 @@
 bool _stm_in_nursery(object_t *obj);
 bool _stm_in_transaction(stm_thread_local_t *tl);
 char *_stm_real_address(object_t *o);
-object_t *_stm_segment_address(char *ptr);
+char *_stm_get_segment_base(long index);
 void _stm_test_switch(stm_thread_local_t *tl);
 object_t *_stm_allocate_old(ssize_t size_rounded_up);
 void _stm_large_dump(void);
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -55,7 +55,7 @@
 bool _stm_was_written(object_t *obj);
 bool _stm_in_nursery(object_t *obj);
 char *_stm_real_address(object_t *obj);
-object_t *_stm_segment_address(char *ptr);
+char *_stm_get_segment_base(long index);
 bool _stm_in_transaction(stm_thread_local_t *tl);
 void _stm_test_switch(stm_thread_local_t *tl);
 
@@ -259,11 +259,6 @@
 HDR = lib.SIZEOF_MYOBJ
 assert HDR == 8
 
-# from nursery.c
-SOME_MEDIUM_SIZE     = 32*1024 - 48
-SOME_LARGE_SIZE      = 100*1024 - 48
-NURSERY_SECTION_SIZE = 128*1024
-
 
 class Conflict(Exception):
     pass
@@ -317,9 +312,6 @@
 def stm_get_real_address(obj):
     return lib._stm_real_address(ffi.cast('object_t*', obj))
 
-def stm_get_segment_address(ptr):
-    return int(ffi.cast('uintptr_t', lib._stm_segment_address(ptr)))
-
 def stm_read(o):
     lib.stm_read(o)
 
@@ -478,3 +470,9 @@
     def push_root_no_gc(self):
         "Pushes an invalid object, to crash in case the GC is called"
         self.push_root(ffi.cast("object_t *", -1))
+
+    def check_char_everywhere(self, obj, expected_content, offset=HDR):
+        for i in range(len(self.tls)):
+            addr = lib._stm_get_segment_base(i)
+            content = addr[int(ffi.cast("uintptr_t", obj)) + offset]
+            assert content == expected_content
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
@@ -425,6 +425,15 @@
         self.abort_transaction()
         py.test.raises(EmptyStack, self.pop_root)
 
+    def test_check_content_after_commit(self):
+        self.start_transaction()
+        lp1 = stm_allocate(16)
+        stm_set_char(lp1, 'X')
+        self.push_root(lp1)
+        self.commit_transaction()
+        lp1 = self.pop_root()
+        self.check_char_everywhere(lp1, 'X')
+
     # def test_resolve_write_write_no_conflict(self):
     #     self.start_transaction()
     #     p1 = stm_allocate(16)


More information about the pypy-commit mailing list