[pypy-commit] pypy use-madv-free: Test and fix

arigo pypy.commits at gmail.com
Thu Jul 14 05:10:00 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: use-madv-free
Changeset: r85686:83477b04d5ed
Date: 2016-07-14 11:11 +0200
http://bitbucket.org/pypy/pypy/changeset/83477b04d5ed/

Log:	Test and fix

diff --git a/rpython/rtyper/lltypesystem/llarena.py b/rpython/rtyper/lltypesystem/llarena.py
--- a/rpython/rtyper/lltypesystem/llarena.py
+++ b/rpython/rtyper/lltypesystem/llarena.py
@@ -445,11 +445,11 @@
 
         pagesize = posixpagesize.get()
         baseaddr = rffi.cast(lltype.Signed, baseaddr)
-        aligned_addr = (baseaddr + pagesize - 1) & (pagesize - 1)
+        aligned_addr = (baseaddr + pagesize - 1) & ~(pagesize - 1)
         size -= (aligned_addr - baseaddr)
         if size >= pagesize:
             rmmap.madvise_free(rffi.cast(rmmap.PTR, aligned_addr),
-                               size & (pagesize - 1))
+                               size & ~(pagesize - 1))
 
 else:
     # XXX any better implementation on Windows?
diff --git a/rpython/rtyper/lltypesystem/test/test_llarena.py b/rpython/rtyper/lltypesystem/test/test_llarena.py
--- a/rpython/rtyper/lltypesystem/test/test_llarena.py
+++ b/rpython/rtyper/lltypesystem/test/test_llarena.py
@@ -1,6 +1,6 @@
-import py
+import py, os
 
-from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, llarena
 from rpython.rtyper.lltypesystem.llarena import (arena_malloc, arena_reset,
     arena_reserve, arena_free, round_up_for_allocation, ArenaError,
     arena_new_view, arena_shrink_obj, arena_protect, has_protect)
@@ -299,6 +299,29 @@
     p.x = 125
     assert p.x == 125
 
+def test_madvise_arena_free():
+    from rpython.rlib import rmmap
+
+    if os.name != 'posix':
+        py.test.skip("posix only")
+    pagesize = llarena.posixpagesize.get()
+    prev = rmmap.madvise_free
+    try:
+        seen = []
+        def my_madvise_free(addr, size):
+            assert lltype.typeOf(addr) == rmmap.PTR
+            seen.append((addr, size))
+        rmmap.madvise_free = my_madvise_free
+        llarena.madvise_arena_free(
+            rffi.cast(llmemory.Address, 123 * pagesize + 1),
+            pagesize * 7 - 2)
+    finally:
+        rmmap.madvise_free = prev
+    assert len(seen) == 1
+    addr, size = seen[0]
+    assert rffi.cast(lltype.Signed, addr) == 124 * pagesize
+    assert size == pagesize * 5
+
 
 class TestStandalone(test_standalone.StandaloneTests):
     def test_compiled_arena_protect(self):


More information about the pypy-commit mailing list