[pypy-commit] pypy stm-gc-2: in-progress
arigo
noreply at buildbot.pypy.org
Sun Apr 7 21:15:48 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch: stm-gc-2
Changeset: r63121:5420a855df2c
Date: 2013-04-07 21:10 +0200
http://bitbucket.org/pypy/pypy/changeset/5420a855df2c/
Log: in-progress
diff --git a/rpython/memory/gc/test/test_stmgc.py b/rpython/memory/gc/test/test_stmgc.py
--- a/rpython/memory/gc/test/test_stmgc.py
+++ b/rpython/memory/gc/test/test_stmgc.py
@@ -70,11 +70,13 @@
del self._tls_dict[self.threadnum]
del self._tldicts[self.threadnum]
+ def get_tldict(self):
+ return self._tldicts[self.threadnum]
+
def tldict_lookup(self, obj):
assert lltype.typeOf(obj) == llmemory.Address
assert obj
- tldict = self._tldicts[self.threadnum]
- for key, value in tldict:
+ for key, value in self.get_tldict():
if obj == key:
return value
else:
@@ -85,7 +87,7 @@
assert lltype.typeOf(localobj) == llmemory.Address
assert obj
assert localobj
- tldict = self._tldicts[self.threadnum]
+ tldict = self.get_tldict()
for key, _ in tldict:
assert obj != key
tldict.append((obj, localobj))
@@ -94,7 +96,7 @@
from rpython.memory.gc.stmtls import StmGCTLS
callback = StmGCTLS._stm_enum_callback
tls = self.get_tls()
- for key, value in self._tldicts[self.threadnum]:
+ for key, value in self.get_tldict():
assert (llmemory.cast_int_to_adr(self._gc.header(value).revision)
== key)
callback(tls, value)
@@ -217,6 +219,7 @@
set_hdr_revision(hdr, P)
def stm_readbarrier(self, P):
+ P = llmemory.cast_ptr_to_adr(P)
hdr = self.header(P)
if hdr.tid & GCFLAG_GLOBAL == 0:
# already a local object
@@ -227,7 +230,7 @@
if hdr.tid & GCFLAG_POSSIBLY_OUTDATED == 0:
assert not L
elif L:
- xxx
+ return L.ptr
return R.ptr
def stm_latest_global_rev(self, G):
@@ -273,6 +276,26 @@
self.gc.stm_operations._transactional_copies.append((R.ptr, L.ptr))
return L
+ def do_local_collection(self):
+ self.gc.stop_transaction()
+ tldict = self.gc.stm_operations.get_tldict()
+ for obj, localobj in tldict:
+ hdr = self.gc.header(obj)
+ localhdr = self.gc.header(localobj)
+ assert localhdr.tid & GCFLAG_GLOBAL == 0
+ assert localhdr.tid & GCFLAG_LOCAL_COPY
+ assert localhdr.tid & GCFLAG_POSSIBLY_OUTDATED == 0
+ localhdr.tid |= GCFLAG_GLOBAL | GCFLAG_NOT_WRITTEN
+ localhdr.tid &= ~GCFLAG_LOCAL_COPY
+ assert localhdr.revision.adr == obj
+ localhdr.revision = r_uint(43)
+ assert hdr.tid & GCFLAG_GLOBAL
+ assert hdr.tid & GCFLAG_NOT_WRITTEN
+ assert hdr.tid & GCFLAG_POSSIBLY_OUTDATED
+ hdr.revision = llmemory.cast_adr_to_uint_symbolic(localobj)
+ del tldict[:]
+ self.gc.start_transaction()
+
class TestBasic(StmGCTests):
@@ -393,7 +416,7 @@
shape.append(found[obj._obj])
return shape
#
- prebuilt = [self.malloc(SR, globl=True)[0] for i in range(15)]
+ prebuilt = [self.malloc(SR, globl=True) for i in range(15)]
globals = set(obj._obj for obj in prebuilt)
root_objects = prebuilt[:]
all_objects = root_objects[:]
@@ -401,7 +424,7 @@
#
for iteration in range(3):
# add 6 freshly malloced objects from the nursery
- new_objects = [self.malloc(SR, globl=False)[0] for i in range(6)]
+ new_objects = [self.malloc(SR, globl=False) for i in range(6)]
set_new_objects = set(obj._obj for obj in new_objects)
all_objects = all_objects + new_objects
set_all_objects = set(obj._obj for obj in all_objects)
@@ -425,18 +448,16 @@
missing_objects.extend(all_objects)
dstobj = random.choice(missing_objects)
name = random.choice(('sr2', 'sr3'))
- src_adr = llmemory.cast_ptr_to_adr(srcobj)
- adr2 = self.stm_writebarrier(src_adr)
- obj2 = llmemory.cast_adr_to_ptr(adr2, lltype.Ptr(SR))
+ obj2 = self.stm_writebarrier(srcobj)
setattr(obj2, name, dstobj)
#
# Record the shape of the graph of reachable objects
shapes = [shape_of_reachable(obj) for obj in root_objects]
#
- # Do a minor collection
+ # Do a local end-of-transaction collection
for p in fromstack:
self.gc.root_walker.push(p)
- self.gc.collect(0)
+ self.do_local_collection()
#
# Reload 'fromstack', which may have moved, and compare the shape
# of the graph of reachable objects now
@@ -488,7 +509,7 @@
from rpython.memory.gc.test import test_stmtls
self.gc.root_walker = test_stmtls.FakeRootWalker()
#
- tr1, tr1_adr = self.malloc(SR, globl=False) # local
+ tr1 = self.malloc(SR, globl=False) # local
self.checkflags(tr1_adr, False, False) # check that it is local
self.gc.root_walker.push(tr1)
self.gc.stop_transaction()
@@ -500,8 +521,8 @@
from rpython.memory.gc.test import test_stmtls
self.gc.root_walker = test_stmtls.FakeRootWalker()
#
- tr1, tr1_adr = self.malloc(SR, globl=False) # local
- tr2, tr2_adr = self.malloc(SR, globl=False) # local
+ tr1 = self.malloc(SR, globl=False) # local
+ tr2 = self.malloc(SR, globl=False) # local
self.checkflags(tr1_adr, False, False) # check that it is local
self.checkflags(tr2_adr, False, False) # check that it is local
tr1.sr2 = tr2
@@ -520,8 +541,8 @@
self.checkflags(sr2_adr, True, False) # sr2 is a global
def test_collect_from_main_thread_was_global_objects(self):
- tr1, tr1_adr = self.malloc(SR, globl=True) # a global prebuilt object
- sr2, sr2_adr = self.malloc(SR, globl=False) # sr2 is a local
+ tr1 = self.malloc(SR, globl=True) # a global prebuilt object
+ sr2 = self.malloc(SR, globl=False) # sr2 is a local
self.checkflags(sr2_adr, False, False) # check that sr2 is a local
sr1_adr = self.gc.stm_writebarrier(tr1_adr)
assert sr1_adr != tr1_adr # sr1 is the local copy
@@ -538,16 +559,16 @@
def test_commit_transaction_empty(self):
self.select_thread(1)
- s, s_adr = self.malloc(S)
- t, t_adr = self.malloc(S)
+ s = self.malloc(S)
+ t = self.malloc(S)
self.gc.stop_transaction() # no roots
self.gc.start_transaction()
main_tls = self.gc.get_tls()
assert main_tls.nursery_free == main_tls.nursery_start # empty
def test_commit_tldict_entry_with_global_references(self):
- t, t_adr = self.malloc(S)
- tr, tr_adr = self.malloc(SR)
+ t = self.malloc(S)
+ tr = self.malloc(SR)
tr.s1 = t
self.select_thread(1)
sr_adr = self.gc.stm_writebarrier(tr_adr)
@@ -556,18 +577,18 @@
assert s_adr != t_adr
def test_commit_local_obj_with_global_references(self):
- t, t_adr = self.malloc(S)
- tr, tr_adr = self.malloc(SR)
+ t = self.malloc(S)
+ tr = self.malloc(SR)
tr.s1 = t
self.select_thread(1)
sr_adr = self.gc.stm_writebarrier(tr_adr)
assert sr_adr != tr_adr
sr = llmemory.cast_adr_to_ptr(sr_adr, lltype.Ptr(SR))
- sr2, sr2_adr = self.malloc(SR)
+ sr2 = self.malloc(SR)
sr.sr2 = sr2
def test_commit_with_ref_to_local_copy(self):
- tr, tr_adr = self.malloc(SR)
+ tr = self.malloc(SR)
sr_adr = self.gc.stm_writebarrier(tr_adr)
assert sr_adr != tr_adr
sr = llmemory.cast_adr_to_ptr(sr_adr, lltype.Ptr(SR))
@@ -576,17 +597,17 @@
assert sr.sr2 == tr
def test_do_get_size(self):
- s1, s1_adr = self.malloc(S)
+ s1 = self.malloc(S)
assert (repr(self.gc._stm_getsize(s1_adr)) ==
repr(fake_get_size(s1_adr)))
def test_id_of_global(self):
- s, s_adr = self.malloc(S)
+ s = self.malloc(S)
i = self.gc.id(s)
assert i == llmemory.cast_adr_to_int(s_adr)
def test_id_of_globallocal(self):
- s, s_adr = self.malloc(S)
+ s = self.malloc(S)
t_adr = self.gc.stm_writebarrier(s_adr) # make a local copy
assert t_adr != s_adr
t = llmemory.cast_adr_to_ptr(t_adr, llmemory.GCREF)
@@ -597,17 +618,17 @@
assert i == self.gc.id(s)
def test_id_of_local_nonsurviving(self):
- s, s_adr = self.malloc(S, globl=False)
+ s = self.malloc(S, globl=False)
i = self.gc.id(s)
assert i != llmemory.cast_adr_to_int(s_adr)
assert i == self.gc.id(s)
self.gc.stop_transaction()
def test_id_of_local_surviving(self):
- sr1, sr1_adr = self.malloc(SR, globl=True)
+ sr1 = self.malloc(SR, globl=True)
assert sr1.s1 == lltype.nullptr(S)
assert sr1.sr2 == lltype.nullptr(SR)
- t2, t2_adr = self.malloc(S, globl=False)
+ t2 = self.malloc(S, globl=False)
t2.a = 423
tr1_adr = self.gc.stm_writebarrier(sr1_adr)
assert tr1_adr != sr1_adr
@@ -624,14 +645,14 @@
assert self.gc.id(s2) == i
def test_hash_of_global(self):
- s, s_adr = self.malloc(S)
+ s = self.malloc(S)
i = self.gc.identityhash(s)
assert i == mangle_hash(llmemory.cast_adr_to_int(s_adr))
self.gc.collect(0)
assert self.gc.identityhash(s) == i
def test_hash_of_globallocal(self):
- s, s_adr = self.malloc(S, globl=True)
+ s = self.malloc(S, globl=True)
t_adr = self.stm_writebarrier(s_adr) # make a local copy
t = llmemory.cast_adr_to_ptr(t_adr, llmemory.GCREF)
i = self.gc.identityhash(t)
@@ -641,7 +662,7 @@
assert i == self.gc.identityhash(s)
def test_hash_of_local_nonsurviving(self):
- s, s_adr = self.malloc(S, globl=False)
+ s = self.malloc(S, globl=False)
i = self.gc.identityhash(s)
# XXX fix me
#assert i != mangle_hash(llmemory.cast_adr_to_int(s_adr))
@@ -649,8 +670,8 @@
self.gc.stop_transaction()
def test_hash_of_local_surviving(self):
- sr1, sr1_adr = self.malloc(SR, globl=True)
- t2, t2_adr = self.malloc(S, globl=False)
+ sr1 = self.malloc(SR, globl=True)
+ t2 = self.malloc(S, globl=False)
t2.a = 424
tr1_adr = self.stm_writebarrier(sr1_adr)
assert tr1_adr != sr1_adr
@@ -668,9 +689,9 @@
assert self.gc.identityhash(s2) == i
def test_weakref_to_global(self):
- swr1, swr1_adr = self.malloc(SWR, globl=True)
- s2, s2_adr = self.malloc(S, globl=True)
- wr1, wr1_adr = self.malloc(WR, globl=False, weakref=True)
+ swr1 = self.malloc(SWR, globl=True)
+ s2 = self.malloc(S, globl=True)
+ wr1 = self.malloc(WR, globl=False, weakref=True)
wr1.wadr = s2_adr
twr1_adr = self.gc.stm_writebarrier(swr1_adr)
twr1 = llmemory.cast_adr_to_ptr(twr1_adr, lltype.Ptr(SWR))
@@ -681,9 +702,9 @@
assert wr2.wadr == s2_adr # survives
def test_weakref_to_local_dying(self):
- swr1, swr1_adr = self.malloc(SWR, globl=True)
- t2, t2_adr = self.malloc(S, globl=False)
- wr1, wr1_adr = self.malloc(WR, globl=False, weakref=True)
+ swr1 = self.malloc(SWR, globl=True)
+ t2 = self.malloc(S, globl=False)
+ wr1 = self.malloc(WR, globl=False, weakref=True)
wr1.wadr = t2_adr
twr1_adr = self.gc.stm_writebarrier(swr1_adr)
twr1 = llmemory.cast_adr_to_ptr(twr1_adr, lltype.Ptr(SWR))
@@ -694,10 +715,10 @@
assert wr2.wadr == llmemory.NULL # dies
def test_weakref_to_local_surviving(self):
- sr1, sr1_adr = self.malloc(SR, globl=True)
- swr1, swr1_adr = self.malloc(SWR, globl=True)
- t2, t2_adr = self.malloc(S, globl=False)
- wr1, wr1_adr = self.malloc(WR, globl=False, weakref=True)
+ sr1 = self.malloc(SR, globl=True)
+ swr1 = self.malloc(SWR, globl=True)
+ t2 = self.malloc(S, globl=False)
+ wr1 = self.malloc(WR, globl=False, weakref=True)
wr1.wadr = t2_adr
twr1_adr = self.gc.stm_writebarrier(swr1_adr)
twr1 = llmemory.cast_adr_to_ptr(twr1_adr, lltype.Ptr(SWR))
@@ -718,8 +739,8 @@
from rpython.memory.gc.test import test_stmtls
self.gc.root_walker = test_stmtls.FakeRootWalker()
#
- sr1, sr1_adr = self.malloc(SR, globl=False)
- wr1, wr1_adr = self.malloc(WR, globl=False, weakref=True)
+ sr1 = self.malloc(SR, globl=False)
+ wr1 = self.malloc(WR, globl=False, weakref=True)
wr1.wadr = sr1_adr
#
self.gc.root_walker.push(wr1)
@@ -738,18 +759,18 @@
assert a == llmemory.NULL
def test_normalize_global_already_global(self):
- sr1, sr1_adr = self.malloc(SR)
+ sr1 = self.malloc(SR)
a = self.gc.stm_normalize_global(sr1_adr)
assert a == sr1_adr
def test_normalize_global_purely_local(self):
self.select_thread(1)
- sr1, sr1_adr = self.malloc(SR)
+ sr1 = self.malloc(SR)
a = self.gc.stm_normalize_global(sr1_adr)
assert a == sr1_adr
def test_normalize_global_local_copy(self):
- sr1, sr1_adr = self.malloc(SR)
+ sr1 = self.malloc(SR)
self.select_thread(1)
tr1_adr = self.gc.stm_writebarrier(sr1_adr)
a = self.gc.stm_normalize_global(sr1_adr)
@@ -764,7 +785,7 @@
nongc = lltype.malloc(NONGC, immortal=True, flavor='raw')
self.gc.root_walker.prebuilt_nongc = [(nongc, 's')]
#
- s, _ = self.malloc(S, globl=False) # a local object
+ s = self.malloc(S, globl=False) # a local object
nongc.s = s
self.gc.collect(0) # keeps LOCAL
s = nongc.s # reload, it moved
More information about the pypy-commit
mailing list