Author: Armin Rigo <ar...@tunes.org>
Branch: mmap-for-arenas
Changeset: r93480:1c3ba5303112
Date: 2017-12-18 21:20 +0100
http://bitbucket.org/pypy/pypy/changeset/1c3ba5303112/

Log:    Write the Windows part of arena_mmap()

diff --git a/rpython/rlib/rmmap.py b/rpython/rlib/rmmap.py
--- a/rpython/rlib/rmmap.py
+++ b/rpython/rlib/rmmap.py
@@ -805,6 +805,18 @@
         def madvise_free(addr, map_size):
             "No madvise() on this platform"
 
+    def arena_mmap(nbytes):
+        flags = MAP_PRIVATE | MAP_ANONYMOUS
+        prot = PROT_READ | PROT_WRITE
+        p = c_mmap_safe(lltype.nullptr(PTR.TO), nbytes, prot, flags, -1, 0)
+        if p == rffi.cast(PTR, -1):
+            p = rffi.cast(PTR, 0)
+        return p
+
+    def arena_munmap(arena_ptr, nbytes):
+        assert nbytes >= 0
+        c_munmap_safe(rffi.cast(PTR, arena_ptr), nbytes)
+
 elif _MS_WINDOWS:
     def mmap(fileno, length, tagname="", access=_ACCESS_DEFAULT, offset=0):
         # XXX flags is or-ed into access by now.
@@ -965,3 +977,13 @@
             rffi.cast(DWORD, PAGE_READWRITE))
         #from rpython.rlib import debug
         #debug.debug_print("madvise_free:", r)
+
+    def arena_mmap(nbytes):
+        null = lltype.nullptr(rffi.VOIDP.TO)
+        res = VirtualAlloc_safe(null, nbytes, MEM_COMMIT | MEM_RESERVE,
+                                PAGE_READWRITE)
+        return rffi.cast(PTR, res)
+
+    def arena_munmap(arena_ptr, nbytes):
+        assert nbytes >= 0
+        VirtualFree_safe(rffi.cast(rffi.VOIDP, arena_ptr), 0, MEM_RELEASE)
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
@@ -543,13 +543,8 @@
 
 def llimpl_arena_mmap(nbytes):
     from rpython.rlib import rmmap
-    flags = rmmap.MAP_PRIVATE | rmmap.MAP_ANONYMOUS
-    prot = rmmap.PROT_READ | rmmap.PROT_WRITE
-    p = rffi.cast(llmemory.Address, rmmap.c_mmap_safe(
-        lltype.nullptr(rmmap.PTR.TO), nbytes, prot, flags, -1, 0))
-    if p == rffi.cast(llmemory.Address, -1):
-        p = rffi.cast(llmemory.Address, 0)
-    return p
+    p = rmmap.arena_mmap(nbytes)
+    return rffi.cast(llmemory.Address, p)
 register_external(arena_mmap, [int], llmemory.Address,
                   'll_arena.arena_mmap',
                   llimpl=llimpl_arena_mmap,
@@ -558,8 +553,7 @@
 
 def llimpl_arena_munmap(arena_addr, nbytes):
     from rpython.rlib import rmmap
-    assert nbytes >= 0
-    rmmap.c_munmap_safe(rffi.cast(rmmap.PTR, arena_addr), nbytes)
+    rmmap.arena_munmap(arena_addr, nbytes)
 register_external(arena_munmap, [llmemory.Address, int], None,
                   'll_arena.arena_munmap',
                   llimpl=llimpl_arena_munmap,
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
@@ -322,6 +322,14 @@
     assert rffi.cast(lltype.Signed, addr) == 124 * pagesize
     assert size == pagesize * 5
 
+def test_arena_mmap_munmap():
+    p = llarena.arena_mmap(32*1024)
+    q = p + 32*1024 - 16
+    llarena.arena_reserve(q, llmemory.sizeof(lltype.Signed))
+    q.signed[0] = -123456789
+    assert q.signed[0] == -123456789
+    llarena.arena_munmap(p, 32*1024)
+
 
 class TestStandalone(test_standalone.StandaloneTests):
     def test_compiled_arena_protect(self):
@@ -361,3 +369,19 @@
             cbuilder.cmdexec('2', expect_crash=True)
             if sys.platform.startswith('win'):
                 ctypes.windll.kernel32.SetErrorMode(old_err_mode)
+
+    def test_compiled_arena_mmap_munmap(self):
+        # mostly a "does not crash during translation" test
+        import sys
+        #
+        def fn(argv):
+            p = llarena.arena_mmap(32*1024)
+            p.char[32*1024-1] = 'X'
+            assert p.char[32*1024-1] == 'X'
+            llarena.arena_munmap(p, 32*1024)
+            print 42
+            return 0
+        #
+        t, cbuilder = self.compile(fn)
+        data = cbuilder.cmdexec('')
+        assert data == '42\n'
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to