changeset 1779:85903b0e9b42

Update macOS memory size check - the original sysctl was returning far too small a value for modern machines (because bounded to a 32-bit int)
author Chris Cannam
date Wed, 11 Sep 2019 13:20:40 +0100
parents 59d9dcfd67c2
children 6d6740b075c3
files system/System.cpp
diffstat 1 files changed, 20 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/system/System.cpp	Wed Sep 11 11:19:27 2019 +0100
+++ b/system/System.cpp	Wed Sep 11 13:20:40 2019 +0100
@@ -186,21 +186,33 @@
 #else
 #ifdef __APPLE__
 
-    unsigned int val;
+    unsigned int val32;
+    int64_t val64;
     int mib[2];
     size_t size_sys;
     
     mib[0] = CTL_HW;
 
-    mib[1] = HW_PHYSMEM;
-    size_sys = sizeof(val);
-    sysctl(mib, 2, &val, &size_sys, NULL, 0);
-    if (val) total = val / 1048576;
+    mib[1] = HW_MEMSIZE;
+    size_sys = sizeof(val64);
+    sysctl(mib, 2, &val64, &size_sys, NULL, 0);
+    if (val64) total = val64 / 1048576;
 
     mib[1] = HW_USERMEM;
-    size_sys = sizeof(val);
-    sysctl(mib, 2, &val, &size_sys, NULL, 0);
-    if (val) available = val / 1048576;
+    size_sys = sizeof(val32);
+    sysctl(mib, 2, &val32, &size_sys, NULL, 0);
+    if (val32) available = val32 / 1048576;
+
+    // The newer memsize sysctl returns a 64-bit value, but usermem is
+    // an old 32-bit value that doesn't seem to have an updated
+    // alternative (?) - so it can't return more than 2G. In practice
+    // it seems to return values far lower than that, even where more
+    // than 2G of real memory is free. So we can't actually tell when
+    // we're getting low on memory at all. Most of the time I think we
+    // just need to use an arbitrary value like this one.
+    if (available < total/4) {
+        available = total/4;
+    }
 
     return;