auxiliary/os: introduce os_get_total_physical_memory helper function

Cc: Alexander von Gluck IV <kallisti5@unixzen.com>
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
This commit is contained in:
Emil Velikov 2014-02-28 03:34:51 +00:00
parent 139751403c
commit 8d2745703c
2 changed files with 71 additions and 0 deletions

View file

@ -47,6 +47,19 @@
#endif
#if defined(PIPE_OS_LINUX)
# include <unistd.h>
#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
# include <sys/sysctl.h>
#elif defined(PIPE_OS_HAIKU)
# include <kernel/OS.h>
#elif defined(PIPE_OS_WINDOWS)
# include <windows.h>
#else
#error unexpected platform in os_sysinfo.c
#endif
void
os_log_message(const char *message)
{
@ -89,3 +102,54 @@ os_get_option(const char *name)
return getenv(name);
}
/**
* Return the size of the total physical memory.
* \param size returns the size of the total physical memory
* \return true for success, or false on failure
*/
bool
os_get_total_physical_memory(uint64_t *size)
{
#if defined(PIPE_OS_LINUX)
const long phys_pages = sysconf(_SC_PHYS_PAGES);
const long page_size = sysconf(_SC_PAGE_SIZE);
*size = phys_pages * page_size;
return (phys_pages > 0 && page_size > 0);
#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
size_t len = sizeof(size);
int mib[2];
mib[0] = CTL_HW;
#if defined(PIPE_OS_APPLE)
mib[1] = HW_MEMSIZE;
#elif defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD)
mib[1] = HW_PHYSMEM64;
#elif defined(PIPE_OS_FREEBSD)
mib[1] = HW_REALMEM;
#else
#error Unsupported *BSD
#endif
return (sysctl(mib, 2, &size, &len, NULL, 0) == 0);
#elif defined(PIPE_OS_HAIKU)
system_info info;
status_t ret;
ret = get_system_info(&info);
*size = info.max_pages * B_PAGE_SIZE;
return (ret == B_OK);
#elif defined(PIPE_OS_WINDOWS)
MEMORYSTATUSEX status;
BOOL ret;
status.dwLength = sizeof(status);
ret = GlobalMemoryStatusEx(&status);
*size = status.ullTotalPhys;
return (ret == TRUE);
#else
#error unexpected platform in os_sysinfo.c
return false;
#endif
}

View file

@ -87,6 +87,13 @@ const char *
os_get_option(const char *name);
/*
* Get the total amount of physical memory available on the system.
*/
bool
os_get_total_physical_memory(uint64_t *size);
#ifdef __cplusplus
}
#endif