Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit