[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