summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/os
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2014-02-28 03:34:51 +0000
committerEmil Velikov <[email protected]>2014-08-15 17:41:57 +0100
commit8d2745703c2ad5dd73a060d135bdb030d0dda40a (patch)
tree680f72f4de48e841e37f46b35abbee66a3fd7104 /src/gallium/auxiliary/os
parent139751403c56d965d7c22bceddd34387759075a9 (diff)
auxiliary/os: introduce os_get_total_physical_memory helper function
Cc: Alexander von Gluck IV <[email protected]> Signed-off-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/os')
-rw-r--r--src/gallium/auxiliary/os/os_misc.c64
-rw-r--r--src/gallium/auxiliary/os/os_misc.h7
2 files changed, 71 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/os/os_misc.c b/src/gallium/auxiliary/os/os_misc.c
index 447e7208f69..3846a9a82cc 100644
--- a/src/gallium/auxiliary/os/os_misc.c
+++ b/src/gallium/auxiliary/os/os_misc.c
@@ -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
+}
diff --git a/src/gallium/auxiliary/os/os_misc.h b/src/gallium/auxiliary/os/os_misc.h
index 582931fe96a..403c8ee6ec5 100644
--- a/src/gallium/auxiliary/os/os_misc.h
+++ b/src/gallium/auxiliary/os/os_misc.h
@@ -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