[pypy-svn] pypy default: implement get_total_memory for darwin, test that it returns > 1MB on all platforms

etrepum commits-noreply at bitbucket.org
Tue Mar 15 20:04:49 CET 2011


Author: Bob Ippolito <bob at redivi.com>
Branch: 
Changeset: r42682:ceed7d933a6d
Date: 2011-03-15 15:04 -0400
http://bitbucket.org/pypy/pypy/changeset/ceed7d933a6d/

Log:	implement get_total_memory for darwin, test that it returns > 1MB on
	all platforms

diff --git a/pypy/rpython/memory/gc/test/test_env.py b/pypy/rpython/memory/gc/test/test_env.py
--- a/pypy/rpython/memory/gc/test/test_env.py
+++ b/pypy/rpython/memory/gc/test/test_env.py
@@ -15,6 +15,9 @@
     assert x == y
     assert type(x) == type(y)
 
+def test_get_total_memory():
+    # total memory should be at least a megabyte
+    assert env.get_total_memory() > 1024*1024
 
 def test_read_from_env():
     saved = os.environ

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
@@ -99,8 +99,9 @@
     def get_total_memory():
         return get_total_memory_linux2('/proc/meminfo')
 
-#elif sys.platform == 'darwin':
-#    ...
+elif sys.platform == 'darwin':
+    def get_total_memory():
+        return get_darwin_sysctl_signed('hw.memsize')
 
 else:
     def get_total_memory():
@@ -191,31 +192,31 @@
                                rffi.INT,
                                sandboxsafe=True)
 
-def get_darwin_cache_size(cache_key):
-    cache_p = lltype.malloc(rffi.LONGLONGP.TO, 1, flavor='raw')
+def get_darwin_sysctl_signed(sysctl_name):
+    sysctl_name_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)
+            rval_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),
+            result = sysctlbyname(sysctl_name,
+                                  rffi.cast(rffi.VOIDP, rval_p),
                                   len_p,
                                   lltype.nullptr(rffi.VOIDP.TO),
                                   rffi.cast(rffi.SIZE_T, 0))
-            cache = 0
+            rval = 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
+                rval = rffi.cast(lltype.Signed, rval_p[0])
+                if rffi.cast(rffi.LONGLONG, rval) != rval_p[0]:
+                    rval = 0    # overflow!
+            return rval
         finally:
             lltype.free(len_p, flavor='raw')
     finally:
-        lltype.free(cache_p, flavor='raw')
+        lltype.free(sysctl_name_p, flavor='raw')
 
 
 def get_L2cache_darwin():
@@ -223,8 +224,8 @@
     on the machine we are running on.
     """
     debug_start("gc-hardware")
-    L2cache = get_darwin_cache_size("hw.l2cachesize")
-    L3cache = get_darwin_cache_size("hw.l3cachesize")
+    L2cache = get_darwin_sysctl_signed("hw.l2cachesize")
+    L3cache = get_darwin_sysctl_signed("hw.l3cachesize")
     debug_print("L2cache =", L2cache)
     debug_print("L3cache =", L3cache)
     debug_stop("gc-hardware")


More information about the Pypy-commit mailing list