19 #ifndef SYS_MEMORYINFO_HXX
20 #define SYS_MEMORYINFO_HXX
30 #define SYS_MEMORYINFO_ON
32 #if ( defined(__APPLE__) && defined(SYS_MEMORYINFO_ON) )
33 # define SYS_MEMORYINFO_MAC
34 # include <mach/vm_statistics.h>
35 # include <mach/mach_types.h>
36 # include <mach/mach_init.h>
37 # include <mach/mach_host.h>
38 # include <mach/mach.h>
40 #elif (defined(SYS_MEMORYINFO_ON) && (defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(_WIN64)) )
41 # define SYS_MEMORYINFO_WINDOWS
46 #elif (defined(SYS_MEMORYINFO_ON))
47 # define SYS_MEMORYINFO_LINUX
49 # include "sys/types.h"
50 # include "sys/sysinfo.h"
67 inline static int parseLine(
char* line){
69 while (*line < '0' || *line >
'9') line++;
81 #ifdef SYS_MEMORYINFO_LINUX
83 FILE* file = fopen(
"/proc/self/status",
"r");
86 while (fgets(line, 128, file) != NULL){
87 if (strncmp(line,
"VmSize:", 7) == 0){
88 result = parseLine(line);
93 return static_cast<double>(result);
96 FILE* file = fopen(
"/proc/self/status",
"r");
99 while (fgets(line, 128, file) != NULL){
100 if (strncmp(line,
"VmRSS:", 6) == 0){
101 result = parseLine(line);
106 return static_cast<double>(result);
109 FILE* file = fopen(
"/proc/self/status",
"r");
112 while (fgets(line, 128, file) != NULL){
113 if (strncmp(line,
"VmPeak:", 7) == 0){
114 result = parseLine(line);
119 return static_cast<double>(result);
122 FILE* file = fopen(
"/proc/self/status",
"r");
125 while (fgets(line, 128, file) != NULL){
126 if (strncmp(line,
"VmHWM:", 6) == 0){
127 result = parseLine(line);
132 return static_cast<double>(result);
135 struct sysinfo memInfo;
137 return static_cast<double>(memInfo.totalram - memInfo.freeram)*memInfo.mem_unit/1024.0;
140 struct sysinfo memInfo;
142 return static_cast<double>(memInfo.freeram)*memInfo.mem_unit/1024.0;
145 struct sysinfo memInfo;
147 return static_cast<double>(memInfo.totalram)*memInfo.mem_unit/1024.0;
158 # elif defined( SYS_MEMORYINFO_WINDOWS )
160 PROCESS_MEMORY_COUNTERS_EX pmc;
161 GetProcessMemoryInfo(GetCurrentProcess(),(PROCESS_MEMORY_COUNTERS*) &pmc,
sizeof(pmc));
162 return static_cast<double>(pmc.WorkingSetSize)/1024.0;
165 PROCESS_MEMORY_COUNTERS_EX pmc;
166 GetProcessMemoryInfo(GetCurrentProcess(),(PROCESS_MEMORY_COUNTERS*) &pmc,
sizeof(pmc));
167 return static_cast<double>(pmc.PrivateUsage)/1024.0;
170 PROCESS_MEMORY_COUNTERS_EX pmc;
171 GetProcessMemoryInfo(GetCurrentProcess(),(PROCESS_MEMORY_COUNTERS*) &pmc,
sizeof(pmc));
172 return static_cast<double>(pmc.PeakWorkingSetSize)/1024.0;
175 PROCESS_MEMORY_COUNTERS_EX pmc;
176 GetProcessMemoryInfo(GetCurrentProcess(),(PROCESS_MEMORY_COUNTERS*) &pmc,
sizeof(pmc));
177 return static_cast<double>(pmc.PeakPagefileUsage)/1024.0;
180 MEMORYSTATUSEX memInfo;
181 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
182 GlobalMemoryStatusEx(&memInfo);
183 return static_cast<double>(memInfo.ullTotalPhys-memInfo.ullAvailPhys)/1024.0;
186 MEMORYSTATUSEX memInfo;
187 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
188 GlobalMemoryStatusEx(&memInfo);
189 return static_cast<double>(memInfo.ullAvailPhys)/1024.0;
192 MEMORYSTATUSEX memInfo;
193 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
194 GlobalMemoryStatusEx(&memInfo);
195 return static_cast<double>(memInfo.ullTotalPhys)/1024.0;
203 # elif defined( SYS_MEMORYINFO_MAC )
205 struct mach_task_basic_info info;
206 mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
207 if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO,(task_info_t)&info, &infoCount ) != KERN_SUCCESS )
208 return std::numeric_limits<double>::quiet_NaN();
210 return static_cast<double>(info.resident_size)/1024.0;
213 struct mach_task_basic_info info;
214 mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
215 if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO,(task_info_t)&info, &infoCount ) != KERN_SUCCESS )
216 return std::numeric_limits<double>::quiet_NaN();
218 return static_cast<double>(info.virtual_size)/1024.0;
221 struct rusage rusage;
222 getrusage( RUSAGE_SELF, &rusage );
223 return static_cast<double>(rusage.ru_maxrss)/1024;
227 return std::numeric_limits<double>::quiet_NaN();
230 return std::numeric_limits<double>::quiet_NaN();
233 return std::numeric_limits<double>::quiet_NaN();
236 return std::numeric_limits<double>::quiet_NaN();
240 return std::numeric_limits<double>::quiet_NaN();
243 return std::numeric_limits<double>::quiet_NaN();
246 return std::numeric_limits<double>::quiet_NaN();
249 return std::numeric_limits<double>::quiet_NaN();
252 return std::numeric_limits<double>::quiet_NaN();
255 return std::numeric_limits<double>::quiet_NaN();
258 return std::numeric_limits<double>::quiet_NaN();
265 #endif // SYS_MEMORYINFO_HXX
static double usedVirtualMemMax()
static double usedPhysicalMemMax()
static double usedVirtualMem()
static double freeSystemMem()
static double usedPhysicalMem()
static double usedSystemMem()
static double systemMem()