[pypy-commit] stmgc hashtable: Change the big test function into a class
arigo
noreply at buildbot.pypy.org
Sun Nov 2 17:09:50 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: hashtable
Changeset: r1491:7a21812ef019
Date: 2014-11-02 17:10 +0100
http://bitbucket.org/pypy/stmgc/changeset/7a21812ef019/
Log: Change the big test function into a class
diff --git a/c7/test/test_hashtable.py b/c7/test/test_hashtable.py
--- a/c7/test/test_hashtable.py
+++ b/c7/test/test_hashtable.py
@@ -17,7 +17,7 @@
raise Conflict
-class TestHashtable(BaseTest):
+class BaseTestHashtable(BaseTest):
def setup_method(self, meth):
BaseTest.setup_method(self, meth)
@@ -49,6 +49,9 @@
self.seen_hashtables += 1
return h
+
+class TestHashtable(BaseTestHashtable):
+
def test_empty(self):
self.start_transaction()
h = self.allocate_hashtable()
@@ -184,106 +187,115 @@
assert htget(h, 1) == lp1
stm_major_collect() # to get rid of the hashtable object
+
+class TestRandomHashtable(BaseTestHashtable):
+
+ def setup_method(self, meth):
+ BaseTestHashtable.setup_method(self, meth)
+ self.values = []
+ self.mirror = None
+ self.roots = []
+
+ def push_roots(self):
+ assert self.roots is None
+ self.roots = []
+ for k, hitems in self.mirror.items():
+ assert lib._get_type_id(k) == 421419
+ for key, value in hitems.items():
+ assert lib._get_type_id(value) < 1000
+ self.push_root(value)
+ self.roots.append(key)
+ self.push_root(k)
+ self.roots.append(None)
+ for v in self.values:
+ self.push_root(v)
+ self.mirror = None
+
+ def pop_roots(self):
+ assert self.mirror is None
+ for i in reversed(range(len(self.values))):
+ self.values[i] = self.pop_root()
+ assert stm_get_char(self.values[i]) == chr((i + 1) & 255)
+ self.mirror = {}
+ for r in reversed(self.roots):
+ obj = self.pop_root()
+ if r is None:
+ assert lib._get_type_id(obj) == 421419
+ self.mirror[obj] = curhitems = {}
+ else:
+ assert lib._get_type_id(obj) < 1000
+ curhitems[r] = obj
+ self.roots = None
+
def test_random_single_thread(self):
import random
- values = []
- mirror = {}
- roots = []
- def push_roots():
- assert roots == []
- for k, hitems in mirror.items():
- assert lib._get_type_id(k) == 421419
- for key, value in hitems.items():
- assert lib._get_type_id(value) < 1000
- self.push_root(value)
- roots.append(key)
- self.push_root(k)
- roots.append(None)
- for v in values:
- self.push_root(v)
- mirror.clear()
- #
- def pop_roots():
- assert mirror == {}
- for i in reversed(range(len(values))):
- values[i] = self.pop_root()
- assert stm_get_char(values[i]) == chr((i + 1) & 255)
- for r in reversed(roots):
- obj = self.pop_root()
- if r is None:
- assert lib._get_type_id(obj) == 421419
- mirror[obj] = curhitems = {}
- else:
- assert lib._get_type_id(obj) < 1000
- curhitems[r] = obj
- del roots[:]
#
for i in range(100):
print "start_transaction"
self.start_transaction()
- pop_roots()
+ self.pop_roots()
for j in range(10):
r = random.random()
if r < 0.05:
h = self.allocate_hashtable()
print "allocate_hashtable ->", h
- mirror[h] = {}
+ self.mirror[h] = {}
elif r < 0.10:
print "stm_minor_collect"
- push_roots()
+ self.push_roots()
stm_minor_collect()
- pop_roots()
+ self.pop_roots()
elif r < 0.11:
print "stm_major_collect"
- push_roots()
+ self.push_roots()
stm_major_collect()
- pop_roots()
+ self.pop_roots()
elif r < 0.5:
- if not mirror: continue
- h = random.choice(mirror.keys())
- if not mirror[h]: continue
- key = random.choice(mirror[h].keys())
- value = mirror[h][key]
+ if not self.mirror: continue
+ h = random.choice(self.mirror.keys())
+ if not self.mirror[h]: continue
+ key = random.choice(self.mirror[h].keys())
+ value = self.mirror[h][key]
print "htget(%r, %r) == %r" % (h, key, value)
- push_roots()
+ self.push_roots()
self.push_root(value)
result = htget(h, key)
value = self.pop_root()
assert result == value
- pop_roots()
+ self.pop_roots()
elif r < 0.6:
- if not mirror: continue
- h = random.choice(mirror.keys())
+ if not self.mirror: continue
+ h = random.choice(self.mirror.keys())
key = random.randrange(0, 40)
- if key in mirror[h]: continue
+ if key in self.mirror[h]: continue
print "htget(%r, %r) == NULL" % (h, key)
- push_roots()
+ self.push_roots()
assert htget(h, key) == ffi.NULL
- pop_roots()
+ self.pop_roots()
elif r < 0.63:
- if not mirror: continue
- h, _ = mirror.popitem()
+ if not self.mirror: continue
+ h, _ = self.mirror.popitem()
print "popped", h
elif r < 0.75:
obj = stm_allocate(32)
- values.append(obj)
- stm_set_char(obj, chr(len(values) & 255))
+ self.values.append(obj)
+ stm_set_char(obj, chr(len(self.values) & 255))
else:
- if not mirror or not values: continue
- h = random.choice(mirror.keys())
+ if not self.mirror or not self.values: continue
+ h = random.choice(self.mirror.keys())
key = random.randrange(0, 32)
- value = random.choice(values)
+ value = random.choice(self.values)
print "htset(%r, %r, %r)" % (h, key, value)
- push_roots()
+ self.push_roots()
tl = self.tls[self.current_thread]
htset(h, key, value, tl)
- pop_roots()
- mirror[h][key] = value
- push_roots()
+ self.pop_roots()
+ self.mirror[h][key] = value
+ self.push_roots()
print "commit_transaction"
self.commit_transaction()
#
self.start_transaction()
self.become_inevitable()
- pop_roots()
+ self.pop_roots()
stm_major_collect() # to get rid of the hashtable objects
More information about the pypy-commit
mailing list