diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c index 4328d9d2622e53c2cbd493d12b3cd072c32d7115..21d4e5443ca61b314a4fb225fc8ebaab286ef384 100644 --- a/rts/posix/OSMem.c +++ b/rts/posix/OSMem.c @@ -263,6 +263,26 @@ W_ getPageSize (void) } } +/* Returns 0 if physical memory size cannot be identified */ +StgWord64 getPhysicalMemorySize (void) +{ + static StgWord64 physMemSize = 0; + if (!physMemSize) { + long ret; + W_ pageSize = getPageSize(); + + ret = sysconf(_SC_PHYS_PAGES); + if (ret == -1) { +#if defined(DEBUG) + errorBelch("warning: getPhysicsMemorySize: cannot get physical memory size"); +#endif + return 0; + } + physMemSize = ret * pageSize; + } + return physMemSize; +} + void setExecutable (void *p, W_ len, rtsBool exec) { StgWord pageSize = getPageSize(); diff --git a/rts/sm/OSMem.h b/rts/sm/OSMem.h index a0d615b4249d9388203dabe084f8da09c0718cc6..db704fc78bb3b1d03815e33cf3137d6967ac60fd 100644 --- a/rts/sm/OSMem.h +++ b/rts/sm/OSMem.h @@ -17,6 +17,7 @@ void osFreeMBlocks(char *addr, nat n); void osReleaseFreeMemory(void); void osFreeAllMBlocks(void); W_ getPageSize (void); +StgWord64 getPhysicalMemorySize (void); void setExecutable (void *p, W_ len, rtsBool exec); #include "EndPrivate.h" diff --git a/rts/win32/OSMem.c b/rts/win32/OSMem.c index 218b25df13016c27d22be2b535f00a289d7add7b..f350076c9404d3888add1e663a225d883d2205ee 100644 --- a/rts/win32/OSMem.c +++ b/rts/win32/OSMem.c @@ -378,6 +378,24 @@ W_ getPageSize (void) } } +/* Returns 0 if physical memory size cannot be identified */ +StgWord64 getPhysicalMemorySize (void) +{ + static StgWord64 physMemSize = 0; + if (!physMemSize) { + MEMORYSTATUSEX status; + status.dwLength = sizeof(status); + if (!GlobalMemoryStatusEx(&status)) { +#if defined(DEBUG) + errorBelch("warning: getPhysicalMemorySize: cannot get physical memory size"); +#endif + return 0; + } + physMemSize = status.ullTotalPhys; + } + return physMemSize; +} + void setExecutable (void *p, W_ len, rtsBool exec) { DWORD dwOldProtect = 0;