[pypy-svn] r77089 - in pypy/branch/gen2-gc/pypy/rpython/memory/gc: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Sep 15 14:58:26 CEST 2010
Author: arigo
Date: Wed Sep 15 14:58:24 2010
New Revision: 77089
Modified:
pypy/branch/gen2-gc/pypy/rpython/memory/gc/minimarkpage.py
pypy/branch/gen2-gc/pypy/rpython/memory/gc/test/test_minimarkpage.py
Log:
Write a random test, and a fix found by it.
Modified: pypy/branch/gen2-gc/pypy/rpython/memory/gc/minimarkpage.py
==============================================================================
--- pypy/branch/gen2-gc/pypy/rpython/memory/gc/minimarkpage.py (original)
+++ pypy/branch/gen2-gc/pypy/rpython/memory/gc/minimarkpage.py Wed Sep 15 14:58:24 2010
@@ -96,7 +96,7 @@
freeblock = result.address[0]
llarena.arena_reset(result,
llmemory.sizeof(llmemory.Address),
- False)
+ 0)
#
else:
# The 'result' is part of the uninitialized blocks.
@@ -116,7 +116,7 @@
page.nextpage = self.full_page_for_size[size_class]
self.full_page_for_size[size_class] = page
#
- llarena.arena_reserve(result, _dummy_size(size), False)
+ llarena.arena_reserve(result, _dummy_size(size))
return result
@@ -252,7 +252,7 @@
# Done by inserting it in the 'free_pages' list.
pageaddr = llmemory.cast_ptr_to_adr(page)
pageaddr = llarena.getfakearenaaddress(pageaddr)
- llarena.arena_reset(pageaddr, llmemory.sizeof(PAGE_HEADER), 0)
+ llarena.arena_reset(pageaddr, self.page_size, 0)
llarena.arena_reserve(pageaddr, llmemory.sizeof(llmemory.Address))
pageaddr.address[0] = self.free_pages
self.free_pages = pageaddr
@@ -294,8 +294,7 @@
# The object should die.
llarena.arena_reset(obj, _dummy_size(block_size), 0)
llarena.arena_reserve(obj,
- llmemory.sizeof(llmemory.Address),
- False)
+ llmemory.sizeof(llmemory.Address))
# Insert 'obj' in the linked list of free blocks.
prevfreeblockat.address[0] = obj
prevfreeblockat = obj
Modified: pypy/branch/gen2-gc/pypy/rpython/memory/gc/test/test_minimarkpage.py
==============================================================================
--- pypy/branch/gen2-gc/pypy/rpython/memory/gc/test/test_minimarkpage.py (original)
+++ pypy/branch/gen2-gc/pypy/rpython/memory/gc/test/test_minimarkpage.py Wed Sep 15 14:58:24 2010
@@ -254,7 +254,9 @@
ok_to_free = self.lastnum >= 1.0
if ok_to_free:
self.lastnum -= 1.0
- self.seen[addr - self.ac._startpageaddr] = ok_to_free
+ key = addr - self.ac._startpageaddr
+ assert key not in self.seen
+ self.seen[key] = ok_to_free
return ok_to_free
def test_mass_free_partial_remains():
@@ -381,3 +383,42 @@
pageaddr + hdrsize + 14*WORD
assert ac.free_pages == NULL
assert ac.full_page_for_size[2] == PAGE_NULL
+
+# ____________________________________________________________
+
+def test_random():
+ import random
+ pagesize = hdrsize + 24*WORD
+ ac = arena_collection_for_test(pagesize, " " * 28)
+ live_objects = {}
+ #
+ # Run the test until ac.allocate_new_arena() is called.
+ class DoneTesting(Exception):
+ pass
+ def done_testing():
+ raise DoneTesting
+ ac.allocate_new_arena = done_testing
+ #
+ try:
+ while True:
+ #
+ # Allocate some more objects
+ for i in range(random.randrange(50, 100)):
+ size_class = random.randrange(1, 7)
+ obj = ac.malloc(size_class * WORD)
+ at = obj - ac._startpageaddr
+ assert at not in live_objects
+ live_objects[at] = None
+ #
+ # Free half the objects, randomly
+ ok_to_free = OkToFree(ac, lambda obj: random.random() < 0.5)
+ ac.mass_free(ok_to_free)
+ #
+ # Check that we have seen all objects
+ assert dict.fromkeys(ok_to_free.seen) == live_objects
+ for at, freed in ok_to_free.seen.items():
+ if freed:
+ del live_objects[at]
+ except DoneTesting:
+ # the following output looks cool on a 112-character-wide terminal.
+ print ac._startpageaddr.arena.usagemap
More information about the Pypy-commit
mailing list