Added an API to get the amount of system RAM
authorSam Lantinga <slouken@libsdl.org>
Thu, 17 Oct 2013 11:32:56 -0700
changeset 7821 c47ae79f0de8
parent 7820 5ce21e1ca0c3
child 7822 6bd98963606b
Added an API to get the amount of system RAM
include/SDL_cpuinfo.h
src/cpuinfo/SDL_cpuinfo.c
--- a/include/SDL_cpuinfo.h	Mon Oct 14 09:15:41 2013 -0700
+++ b/include/SDL_cpuinfo.h	Thu Oct 17 11:32:56 2013 -0700
@@ -134,6 +134,11 @@
  */
 extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void);
 
+/**
+ *  This function returns the amount of RAM configured in the system, in MB.
+ */
+extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void);
+
 
 /* Ends C function definitions when using C++ */
 #ifdef __cplusplus
--- a/src/cpuinfo/SDL_cpuinfo.c	Mon Oct 14 09:15:41 2013 -0700
+++ b/src/cpuinfo/SDL_cpuinfo.c	Thu Oct 17 11:32:56 2013 -0700
@@ -607,6 +607,60 @@
     return SDL_FALSE;
 }
 
+static int SDL_SystemRAM = 0;
+
+int
+SDL_GetSystemRAM(void)
+{
+    if (!SDL_SystemRAM) {
+#if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+        if (SDL_SystemRAM <= 0) {
+            SDL_SystemRAM = (int)((Sint64)sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) / (1024*1024));
+        }
+#endif
+#ifdef HAVE_SYSCTLBYNAME
+        if (SDL_SystemRAM <= 0) {
+            int mib[2] = {CTL_HW, HW_MEMSIZE};
+            uint64 memsize = 0;
+            size_t len = sizeof(memsize);
+            
+            if (sysctl(mib, 2, &memsize, &len, NULL, 0) == 0) {
+                SDL_SystemRAM = (int)(memsize / (1024*1024));
+            }
+        }
+#endif
+#ifdef __WIN32__
+        if (SDL_SystemRAM <= 0) {
+            MEMORYSTATUSEX stat;
+            if (GlobalMemoryStatusEx(&stat)) {
+                SDL_SystemRAM = (int)(stat.ullTotalPhys / (1024 * 1024));
+            }
+        }
+#endif
+#if 0 //def __LINUX__
+        FILE *fpMemInfo = fopen("/proc/meminfo", "r");
+        if (fpMemInfo) {
+            char line[1024];
+            const char *search = "MemTotal:";
+            const size_t searchlen = SDL_strlen(search);
+            while (fgets(line, sizeof(line), fpMemInfo)) {
+                if (SDL_strncasecmp(search, line, searchlen) == 0) {
+                    char *val = line+searchlen;
+                    while (SDL_isspace(*val)) {
+                        ++val;
+                    }
+                    SDL_SystemRAM = SDL_atoi(val) / 1024; /* convert from kB to MB */
+                    break;
+                }
+            }
+            fclose(fpMemInfo);
+        }
+#endif
+    }
+    return SDL_SystemRAM;
+}
+
+
 #ifdef TEST_MAIN
 
 #include <stdio.h>
@@ -627,6 +681,7 @@
     printf("SSE3: %d\n", SDL_HasSSE3());
     printf("SSE4.1: %d\n", SDL_HasSSE41());
     printf("SSE4.2: %d\n", SDL_HasSSE42());
+    printf("RAM: %d MB\n", SDL_GetSystemRAM());
     return 0;
 }