[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