[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