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