auxiliary/os: introduce os_get_total_physical_memory helper function
authorEmil Velikov <emil.l.velikov@gmail.com>
Fri, 28 Feb 2014 03:34:51 +0000 (03:34 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Fri, 15 Aug 2014 16:41:57 +0000 (17:41 +0100)
Cc: Alexander von Gluck IV <kallisti5@unixzen.com>
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
src/gallium/auxiliary/os/os_misc.c
src/gallium/auxiliary/os/os_misc.h

index 447e7208f69b60d57722d73c5ace1dbc08616ca6..3846a9a82cc6b611cdd4cb0abdfe8df53d9961d6 100644 (file)
 #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
+}
index 582931fe96a49034a0f11c76679114441cc81e8a..403c8ee6ec5c345669f810649fe89486e3507072 100644 (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