summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorAustin Seipp <austin@well-typed.com>2013-10-26 12:50:16 -0500
committerAustin Seipp <austin@well-typed.com>2013-10-26 12:51:09 -0500
commit619fd18de0700edb531db5f3836b034489460b88 (patch)
tree433a5a11a283a83265c5d36b405452a34107712d /rts
parentd34f1c851d6ef01aef109dd3515db17b795056aa (diff)
downloadhaskell-619fd18de0700edb531db5f3836b034489460b88.tar.gz
Fix getPhysicalMemorySize on OS X (#8481)
Darwin doesn't support _SC_PHYS_PAGES, but we can get the exact number of bytes of physical memory via 'hw.memsize', so we use that instead. Signed-off-by: Austin Seipp <austin@well-typed.com>
Diffstat (limited to 'rts')
-rw-r--r--rts/posix/OSMem.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c
index 21d4e5443c..acdb00e3c9 100644
--- a/rts/posix/OSMem.c
+++ b/rts/posix/OSMem.c
@@ -35,6 +35,7 @@
#if darwin_HOST_OS
#include <mach/mach.h>
#include <mach/vm_map.h>
+#include <sys/sysctl.h>
#endif
static caddr_t next_request = 0;
@@ -268,10 +269,24 @@ StgWord64 getPhysicalMemorySize (void)
{
static StgWord64 physMemSize = 0;
if (!physMemSize) {
- long ret;
+#ifdef darwin_HOST_OS
+ /* So, darwin doesn't support _SC_PHYS_PAGES, but it does
+ support getting the raw memory size in bytes through
+ sysctlbyname(hw.memsize); */
+ size_t len = sizeof(physMemSize);
+ int ret = -1;
+
+ /* Note hw.memsize is in bytes, so no need to multiply by page size. */
+ ret = sysctlbyname("hw.memsize", &physMemSize, &len, NULL, 0);
+ if (ret == -1) {
+ physMemSize = 0;
+ return 0;
+ }
+#else
+ /* We'll politely assume we have a system supporting _SC_PHYS_PAGES
+ * otherwise. */
W_ pageSize = getPageSize();
-
- ret = sysconf(_SC_PHYS_PAGES);
+ long ret = sysconf(_SC_PHYS_PAGES);
if (ret == -1) {
#if defined(DEBUG)
errorBelch("warning: getPhysicsMemorySize: cannot get physical memory size");
@@ -279,6 +294,7 @@ StgWord64 getPhysicalMemorySize (void)
return 0;
}
physMemSize = ret * pageSize;
+#endif /* darwin_HOST_OS */
}
return physMemSize;
}