[pypy-svn] r68642 - pypy/branch/gc-arena/pypy/rpython/lltypesystem
arigo at codespeak.net
arigo at codespeak.net
Mon Oct 19 17:59:58 CEST 2009
Author: arigo
Date: Mon Oct 19 17:59:58 2009
New Revision: 68642
Added:
pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena_nt.py (contents, props changed)
Modified:
pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena.py
Log:
Attempt to write a Win32 version. Untested,
probably contains at least typos.
Modified: pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena.py
==============================================================================
--- pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena.py (original)
+++ pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena.py Mon Oct 19 17:59:58 2009
@@ -19,8 +19,8 @@
if os.name == 'posix':
from pypy.rpython.lltypesystem import llarena_posix as llarena_impl
-#elif os.name == 'win32':
-# ...
+elif os.name == 'nt':
+ from pypy.rpython.lltypesystem import llarena_nt as llarena_impl
else:
from pypy.rpython.lltypesystem import llarena_generic as llarena_impl
Added: pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena_nt.py
==============================================================================
--- (empty file)
+++ pypy/branch/gc-arena/pypy/rpython/lltypesystem/llarena_nt.py Mon Oct 19 17:59:58 2009
@@ -0,0 +1,108 @@
+import os, sys
+from pypy.rpython.tool import rffi_platform
+from pypy.rpython.lltypesystem import rffi, lltype, llmemory
+from pypy.rpython.lltypesystem.llarena_llinterp import Z_CLEAR_LARGE_AREA
+from pypy.rpython.lltypesystem.llarena_llinterp import Z_CLEAR_SMALL_AREA
+from pypy.rpython.lltypesystem.llarena_llinterp import Z_INACCESSIBLE
+from pypy.rpython.lltypesystem.llarena_llinterp import Z_ACCESSIBLE
+from pypy.rlib.rwin32 import DWORD, BOOL
+
+implements_inaccessible = True
+
+# ____________________________________________________________
+
+class CConfig:
+ _compilation_info_ = ExternalCompilationInfo(
+ includes=['windows.h'])
+
+ SYSTEM_INFO = rffi_platform.Struct(
+ 'SYSTEM_INFO', [
+ ("dwPageSize", DWORD),
+ ])
+
+config = rffi_platform.configure(CConfig)
+
+SYSTEM_INFO = config['SYSTEM_INFO']
+SYSTEM_INFO_P = lltype.Ptr(SYSTEM_INFO)
+
+def winexternal(name, args, result):
+ return rffi.llexternal(name, args, result,
+ compilation_info=CConfig._compilation_info_,
+ calling_conv='win')
+
+# ____________________________________________________________
+
+GetSystemInfo = winexternal('GetSystemInfo', [SYSTEM_INFO_P], lltype.Void)
+
+class WinPageSize:
+ def __init__(self):
+ self.pagesize = 0
+ _freeze_ = __init__
+win_pagesize = WinPageSize()
+
+def getpagesize():
+ pagesize = win_pagesize.pagesize
+ if pagesize == 0:
+ si = rffi.make(SYSTEM_INFO)
+ try:
+ GetSystemInfo(si)
+ pagesize = rffi.cast(lltype.Signed, si.c_dwPageSize)
+ finally:
+ lltype.free(si, flavor="raw")
+ win_pagesize.pagesize = pagesize
+ return pagesize
+
+# ____________________________________________________________
+
+VirtualAlloc = winexternal('VirtualAlloc', [llmemory.Address,
+ rffi.SIZE_T, DWORD, DWORD],
+ llmemory.Address)
+VirtualFree = winexternal('VirtualFree', [llmemory.Address,
+ rffi.SIZE_T, DWORD],
+ BOOL)
+
+MEM_COMMIT = 0x1000
+MEM_RESERVE = 0x2000
+MEM_DECOMMIT = 0x4000
+MEM_RELEASE = 0x8000
+PAGE_READWRITE = 0x04
+
+class VirtualAllocMemoryError(Exception):
+ pass
+
+def _virtual_alloc(arena_addr, nbytes, flags, protect):
+ result = VirtualFree(arena_addr,
+ rffi.cast(rffi.SIZE_T, nbytes),
+ rffi.cast(DWORD, flags),
+ rffi.cast(DWORD, protect))
+ if result == llmemory.NULL:
+ raise VirtualAllocMemoryError
+ return result
+
+def _virtual_free(arena_addr, nbytes, flags):
+ result = VirtualFree(arena_addr,
+ rffi.cast(rffi.SIZE_T, nbytes),
+ rffi.cast(DWORD, flags))
+ if rffi.cast(lltype.Signed, result) == 0:
+ raise VirtualAllocMemoryError
+
+def llimpl_arena_malloc(nbytes, zero):
+ flAllocationType = MEM_RESERVE
+ if zero != Z_INACCESSIBLE:
+ flAllocationType |= MEM_COMMIT
+ return _virtual_alloc(llmemory.NULL, nbytes,
+ flAllocationType, PAGE_READWRITE)
+
+def llimpl_arena_free(arena_addr, nbytes):
+ _virtual_free(arena_addr, 0, MEM_RELEASE)
+
+def llimpl_arena_reset(arena_addr, size, zero):
+ if zero == Z_CLEAR_LARGE_AREA:
+ _virtual_free(arena_addr, size, MEM_DECOMMIT)
+ _virtual_alloc(arena_addr, size, MEM_COMMIT, PAGE_READWRITE)
+ elif zero == Z_CLEAR_SMALL_AREA:
+ llmemory.raw_memclear(arena_addr, size)
+ elif zero == Z_ACCESSIBLE:
+ _virtual_alloc(arena_addr, size, MEM_COMMIT, PAGE_READWRITE)
+ elif zero == Z_INACCESSIBLE:
+ _virtual_free(arena_addr, size, MEM_DECOMMIT)
More information about the Pypy-commit
mailing list