[pypy-commit] stmgc c7-refactor: keep track of object sizes and assert them sometimes

Remi Meier noreply at buildbot.pypy.org
Fri Feb 21 15:06:48 CET 2014


Author: Remi Meier
Branch: c7-refactor
Changeset: r808:620c1f07da76
Date: 2014-02-21 15:06 +0100
http://bitbucket.org/pypy/stmgc/changeset/620c1f07da76/

Log:	keep track of object sizes and assert them sometimes

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
@@ -207,16 +207,21 @@
         self.global_time = 0
         self.root_numbering = 0
         self.ref_type_map = {}
+        self.root_sizes = {}
 
-    def get_new_root_name(self, is_ref_type):
+    def get_new_root_name(self, is_ref_type, size):
         self.root_numbering += 1
         r = "lp_%s_%d" % ("ref" if is_ref_type else "char", self.root_numbering)
         self.ref_type_map[r] = is_ref_type
+        self.root_sizes[r] = size
         return r
 
     def has_ref_type(self, r):
         return self.ref_type_map[r]
 
+    def get_root_size(self, r):
+        return self.root_sizes[r]
+
     def inc_and_get_global_time(self):
         self.global_time += 1
         return self.global_time
@@ -329,13 +334,14 @@
 
 class OpAllocate(Operation):
     def do(self, ex, global_state, thread_state):
-        r = global_state.get_new_root_name(False)
-        thread_state.push_roots(ex)
         size = global_state.rnd.choice([
-            16,
+            "16",
             "SOME_MEDIUM_SIZE+16",
             #"SOME_LARGE_SIZE+16",
         ])
+        r = global_state.get_new_root_name(False, size)
+        thread_state.push_roots(ex)
+
         ex.do('%s = stm_allocate(%s)' % (r, size))
         thread_state.transaction_state.add_root(r, 0)
 
@@ -345,9 +351,9 @@
 
 class OpAllocateRef(Operation):
     def do(self, ex, global_state, thread_state):
-        r = global_state.get_new_root_name(True)
+        num = str(global_state.rnd.randrange(1, 100))
+        r = global_state.get_new_root_name(True, num)
         thread_state.push_roots(ex)
-        num = global_state.rnd.randrange(1, 100)
         ex.do('%s = stm_allocate_refs(%s)' % (r, num))
         thread_state.transaction_state.add_root(r, "ffi.NULL")
 
@@ -392,20 +398,22 @@
         # decide on a value to write
         if is_ref:
             v = thread_state.get_random_root()
-            ex.do("idx = (stm_get_obj_size(%s) - HDR) / WORD - 1" % r)
         else:
             v = ord(global_state.rnd.choice("abcdefghijklmnop"))
-            ex.do("offset = stm_get_obj_size(%s) - 1" % r)
         trs.write_root(r, v)
         #
-        if trs.check_must_abort():
+        aborts = trs.check_must_abort()
+        if aborts:
             thread_state.abort_transaction()
+        offset = global_state.get_root_size(r) + " - 1"
         if is_ref:
-            ex.do(raising_call(trs.check_must_abort(),
-                               "stm_set_ref", r, "idx", v))
+            ex.do(raising_call(aborts, "stm_set_ref", r, offset, v))
+            if not aborts:
+                ex.do(raising_call(False, "stm_set_ref", r, "0", v))
         else:
-            ex.do(raising_call(trs.check_must_abort(),
-                               "stm_set_char", r, repr(chr(v)), "offset"))
+            ex.do(raising_call(aborts, "stm_set_char", r, repr(chr(v)), offset))
+            if not aborts:
+                ex.do(raising_call(False, "stm_set_char", r, repr(chr(v)), "HDR"))
 
 class OpRead(Operation):
     def do(self, ex, global_state, thread_state):
@@ -413,11 +421,12 @@
         trs = thread_state.transaction_state
         v = trs.read_root(r)
         #
+        offset = global_state.get_root_size(r) + " - 1"
         if global_state.has_ref_type(r):
-            ex.do("idx = (stm_get_obj_size(%s) - HDR) / WORD - 1" % r)
             if v in thread_state.saved_roots or v in global_state.prebuilt_roots:
                 # v = root known to this transaction; or prebuilt
-                ex.do("assert stm_get_ref(%s, idx) == %s" % (r, v))
+                ex.do("assert stm_get_ref(%s, %s) == %s" % (r, offset, v))
+                ex.do("assert stm_get_ref(%s, 0) == %s" % (r, v))
             elif v != "ffi.NULL":
                 # if v came from this transaction: re-add it to saved_roots because
                 #     it survived by being referenced by another saved root
@@ -433,14 +442,25 @@
                 else:
                     ex.do("# register %r in this thread" % v)
                 #
-                ex.do("%s = stm_get_ref(%s, idx)" % (v, r))
+                ex.do("%s = stm_get_ref(%s, %s)" % (v, r, offset))
+                ex.do("%s = stm_get_ref(%s, 0)" % (v, r))
                 thread_state.register_root(v)
             else:
                 # v is NULL; we still need to read it (as it should be in the read-set):
-                ex.do("assert stm_get_ref(%s, idx) == %s" % (r,v))
+                ex.do("assert stm_get_ref(%s, %s) == %s" % (r,offset,v))
+                ex.do("assert stm_get_ref(%s, 0) == %s" % (r,v))
         else:
-            ex.do("offset = stm_get_obj_size(%s) - 1" % r)
-            ex.do("assert stm_get_char(%s, offset) == %s" % (r, repr(chr(v))))
+            ex.do("assert stm_get_char(%s, %s) == %s" % (r, offset, repr(chr(v))))
+            ex.do("assert stm_get_char(%s, HDR) == %s" % (r, repr(chr(v))))
+
+class OpAssertSize(Operation):
+    def do(self, ex, global_state, thread_state):
+        r = thread_state.get_random_root()
+        size = global_state.get_root_size(r)
+        if global_state.has_ref_type(r):
+            ex.do("assert stm_get_obj_size(%s) == %s" % (r, size + " * WORD + HDR"))
+        else:
+            ex.do("assert stm_get_obj_size(%s) == %s" % (r, size))
 
 class OpSwitchThread(Operation):
     def do(self, ex, global_state, thread_state):
@@ -466,12 +486,7 @@
         N_OBJECTS = 3
         N_THREADS = 2
         ex = Exec(self)
-        ex.do("""
-################################################################
-################################################################
-################################################################
-################################################################
-        """)
+        ex.do("################################################################\n"*10)
         ex.do('# initialization')
 
         global_state = GlobalState(ex, rnd)
@@ -481,13 +496,13 @@
         curr_thread = global_state.thread_states[0]
 
         for i in range(N_OBJECTS):
-            r = global_state.get_new_root_name(False)
-            ex.do('%s = stm_allocate_old(16)' % r)
+            r = global_state.get_new_root_name(False, "384")
+            ex.do('%s = stm_allocate_old(384)' % r)
             global_state.committed_transaction_state.write_root(r, 0)
             global_state.prebuilt_roots.append(r)
 
-            r = global_state.get_new_root_name(True)
-            ex.do('%s = stm_allocate_old_refs(1)' % r)
+            r = global_state.get_new_root_name(True, "50")
+            ex.do('%s = stm_allocate_old_refs(50)' % r)
             global_state.committed_transaction_state.write_root(r, "ffi.NULL")
             global_state.prebuilt_roots.append(r)
         global_state.committed_transaction_state.write_set = set()
@@ -503,6 +518,7 @@
             OpAbortTransaction,
             OpForgetRoot,
             OpBecomeInevitable,
+            OpAssertSize,
             # OpMinorCollect,
         ]
         for _ in range(200):


More information about the pypy-commit mailing list