[pypy-svn] r79902 - in pypy/branch/gc-debug/pypy: rlib rpython/lltypesystem
arigo at codespeak.net
arigo at codespeak.net
Wed Dec 8 18:07:21 CET 2010
Author: arigo
Date: Wed Dec 8 18:07:19 2010
New Revision: 79902
Modified:
pypy/branch/gc-debug/pypy/rlib/rmmap.py
pypy/branch/gc-debug/pypy/rpython/lltypesystem/llarena.py
Log:
Implement arena_protect() on Windows. Untested.
Modified: pypy/branch/gc-debug/pypy/rlib/rmmap.py
==============================================================================
--- pypy/branch/gc-debug/pypy/rlib/rmmap.py (original)
+++ pypy/branch/gc-debug/pypy/rlib/rmmap.py Wed Dec 8 18:07:19 2010
@@ -67,7 +67,7 @@
constant_names = ['PAGE_READONLY', 'PAGE_READWRITE', 'PAGE_WRITECOPY',
'FILE_MAP_READ', 'FILE_MAP_WRITE', 'FILE_MAP_COPY',
'DUPLICATE_SAME_ACCESS', 'MEM_COMMIT', 'MEM_RESERVE',
- 'MEM_RELEASE', 'PAGE_EXECUTE_READWRITE']
+ 'MEM_RELEASE', 'PAGE_EXECUTE_READWRITE', 'PAGE_NOACCESS']
for name in constant_names:
setattr(CConfig, name, rffi_platform.ConstantInteger(name))
Modified: pypy/branch/gc-debug/pypy/rpython/lltypesystem/llarena.py
==============================================================================
--- pypy/branch/gc-debug/pypy/rpython/lltypesystem/llarena.py (original)
+++ pypy/branch/gc-debug/pypy/rpython/lltypesystem/llarena.py Wed Dec 8 18:07:19 2010
@@ -511,27 +511,34 @@
rffi.INT,
sandboxsafe=True, _nowrapper=True,
compilation_info=_eci)
- def llimpl_arena_protect(addr, size, inaccessible):
- # do some alignment
- start = rffi.cast(lltype.Signed, addr)
- end = start + size
- start = (start + 4095) & ~ 4095
- end = end & ~ 4095
- if end > start:
- if inaccessible:
- prot = 0
- else:
- from pypy.rlib.rmmap import PROT_READ, PROT_WRITE
- prot = PROT_READ | PROT_WRITE
- raw_mprotect(rffi.cast(llmemory.Address, start),
- rffi.cast(rffi.SIZE_T, end - start),
- rffi.cast(rffi.INT, prot))
- # ignore potential errors
+ def llimpl_protect(addr, size, inaccessible):
+ if inaccessible:
+ prot = 0
+ else:
+ from pypy.rlib.rmmap import PROT_READ, PROT_WRITE
+ prot = PROT_READ | PROT_WRITE
+ raw_mprotect(addr, rffi.cast(rffi.SIZE_T, size),
+ rffi.cast(rffi.INT, prot))
+ # ignore potential errors
+ has_protect = True
+
+elif os.name == 'nt':
+ def llimpl_protect(addr, size, inaccessible):
+ from pypy.rlib.rmmap import VirtualProtect, LPDWORD
+ if inaccessible:
+ from pypy.rlib.rmmap import PAGE_NOACCESS as newprotect
+ else:
+ from pypy.rlib.rmmap import PAGE_READWRITE as newprotect
+ arg = lltype.malloc(LPDWORD.TO, 1, zero=True, flavor='raw')
+ VirtualProtect(rffi.cast(rffi.VOIDP, addr),
+ rffi.cast(rffi.SIZE_T, size),
+ newprotect,
+ arg)
+ # ignore potential errors
+ lltype.free(arg, flavor='raw')
has_protect = True
else:
- def llimpl_arena_protect(addr, size, inaccessible):
- pass
has_protect = False
@@ -603,6 +610,16 @@
'll_arena.arena_new_view', llimpl=llimpl_arena_new_view,
llfakeimpl=arena_new_view, sandboxsafe=True)
+def llimpl_arena_protect(addr, size, inaccessible):
+ if has_protect:
+ # do some alignment
+ start = rffi.cast(lltype.Signed, addr)
+ end = start + size
+ start = (start + 4095) & ~ 4095
+ end = end & ~ 4095
+ if end > start:
+ llimpl_protect(rffi.cast(llmemory.Address, start), end-start,
+ inaccessible)
register_external(arena_protect, [llmemory.Address, lltype.Signed,
lltype.Bool], lltype.Void,
'll_arena.arena_protect', llimpl=llimpl_arena_protect,
More information about the Pypy-commit
mailing list