[pypy-svn] pypy default: merge
fijal
commits-noreply at bitbucket.org
Mon Mar 14 00:40:31 CET 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r42583:1e04185aa0e7
Date: 2011-03-13 19:40 -0400
http://bitbucket.org/pypy/pypy/changeset/1e04185aa0e7/
Log: merge
diff --git a/pypy/rpython/memory/gc/env.py b/pypy/rpython/memory/gc/env.py
--- a/pypy/rpython/memory/gc/env.py
+++ b/pypy/rpython/memory/gc/env.py
@@ -190,44 +190,55 @@
rffi.VOIDP, rffi.SIZE_T],
rffi.INT,
sandboxsafe=True)
+
+def get_darwin_cache_size(cache_key):
+ cache_p = lltype.malloc(rffi.LONGLONGP.TO, 1, flavor='raw')
+ try:
+ len_p = lltype.malloc(rffi.SIZE_TP.TO, 1, flavor='raw')
+ try:
+ size = rffi.sizeof(rffi.LONGLONG)
+ cache_p[0] = rffi.cast(rffi.LONGLONG, 0)
+ len_p[0] = rffi.cast(rffi.SIZE_T, size)
+ # XXX a hack for llhelper not being robust-enough
+ result = sysctlbyname(cache_key,
+ rffi.cast(rffi.VOIDP, cache_p),
+ len_p,
+ lltype.nullptr(rffi.VOIDP.TO),
+ rffi.cast(rffi.SIZE_T, 0))
+ if (rffi.cast(lltype.Signed, result) == 0 and
+ rffi.cast(lltype.Signed, len_p[0]) == size):
+ cache = rffi.cast(lltype.Signed, cache_p[0])
+ if rffi.cast(rffi.LONGLONG, cache) != cache_p[0]:
+ cache = 0 # overflow!
+ return cache
+ finally:
+ lltype.free(len_p, flavor='raw')
+ finally:
+ lltype.free(cache_p, flavor='raw')
+
+
def get_L2cache_darwin():
"""Try to estimate the best nursery size at run-time, depending
on the machine we are running on.
"""
debug_start("gc-hardware")
- L2cache = 0
- l2cache_p = lltype.malloc(rffi.LONGLONGP.TO, 1, flavor='raw')
- try:
- len_p = lltype.malloc(rffi.SIZE_TP.TO, 1, flavor='raw')
- try:
- size = rffi.sizeof(rffi.LONGLONG)
- l2cache_p[0] = rffi.cast(rffi.LONGLONG, 0)
- len_p[0] = rffi.cast(rffi.SIZE_T, size)
- # XXX a hack for llhelper not being robust-enough
- result = sysctlbyname("hw.l2cachesize",
- rffi.cast(rffi.VOIDP, l2cache_p),
- len_p,
- lltype.nullptr(rffi.VOIDP.TO),
- rffi.cast(rffi.SIZE_T, 0))
- if (rffi.cast(lltype.Signed, result) == 0 and
- rffi.cast(lltype.Signed, len_p[0]) == size):
- L2cache = rffi.cast(lltype.Signed, l2cache_p[0])
- if rffi.cast(rffi.LONGLONG, L2cache) != l2cache_p[0]:
- L2cache = 0 # overflow!
- finally:
- lltype.free(len_p, flavor='raw')
- finally:
- lltype.free(l2cache_p, flavor='raw')
+ L2cache = get_darwin_cache_size("hw.l2cachesize")
+ L3cache = get_darwin_cache_size("hw.l3cachesize")
debug_print("L2cache =", L2cache)
+ debug_print("L3cache =", L3cache)
debug_stop("gc-hardware")
- if L2cache > 0:
- return L2cache
+
+ mangled = L2cache + L3cache
+
+ if mangled > 0:
+ return mangled
else:
# Print a top-level warning even in non-debug builds
llop.debug_print(lltype.Void,
"Warning: cannot find your CPU L2 cache size with sysctl()")
return -1
+
# --------------------
get_L2cache = globals().get('get_L2cache_' + sys.platform,
More information about the Pypy-commit
mailing list