Skip to content
Snippets Groups Projects
Commit 619fd18d authored by Austin Seipp's avatar Austin Seipp
Browse files

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: default avatarAustin Seipp <austin@well-typed.com>
parent d34f1c85
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment