18 #include "itkConfigure.h"
21 #if defined(WIN32) || defined(_WIN32)
23 #if defined(SUPPORT_PSAPI)
26 #endif // defined(WIN32) || defined(_WIN32)
32 #if defined(__APPLE__) && MAC_OS_X_VERSION >= MAC_OS_X_VERSION_10_2
36 #if defined(__SUNPRO_CC) || defined (__sun__)
41 #endif // !defined(__SUNPRO_CC) && !defined (__sun__)
43 #if !defined(WIN32) && !defined(_WIN32)
44 #include <sys/resource.h>
45 #if !defined(__APPLE__) && !defined(__SUNPRO_CC) && !defined (__sun__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
47 #endif // !defined(__APPLE__) && !defined(__SUNPRO_CC) && !defined (__sun__)
48 #endif // !defined(WIN32) && !defined(_WIN32)
50 #if defined(__OpenBSD__)
62 #if defined(WIN32) || defined(_WIN32)
66 WindowsMemoryUsageObserver::WindowsMemoryUsageObserver()
68 #if defined(SUPPORT_TOOLHELP32)
69 m_hNTLib = ::LoadLibraryA(
"ntdll.dll");
73 ZwQuerySystemInformation = (PZwQuerySystemInformation)::GetProcAddress(m_hNTLib,
74 "ZwQuerySystemInformation");
79 WindowsMemoryUsageObserver::~WindowsMemoryUsageObserver()
81 #if defined (SUPPORT_TOOLHELP32)
84 FreeLibrary(m_hNTLib);
89 #if defined(SUPPORT_TOOLHELP32)
91 #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
93 typedef LONG KPRIORITY;
94 #define SystemProcessesAndThreadsInformation 5
96 typedef struct _CLIENT_ID {
101 typedef struct _UNICODE_STRING {
103 USHORT MaximumLength;
107 typedef struct _VM_COUNTERS {
110 SIZE_T PeakVirtualSize;
111 SIZE_T PageFaultCount;
112 SIZE_T PeakWorkingSetSize;
113 SIZE_T WorkingSetSize;
114 SIZE_T QuotaPeakPagedPoolUsage;
115 SIZE_T QuotaPagedPoolUsage;
116 SIZE_T QuotaPeakNonPagedPoolUsage;
117 SIZE_T QuotaNonPagedPoolUsage;
118 SIZE_T PagefileUsage;
119 SIZE_T PeakPagefileUsage;
122 SIZE_T PeakVirtualSize;
124 ULONG PageFaultCount;
125 SIZE_T PeakWorkingSetSize;
126 SIZE_T WorkingSetSize;
127 SIZE_T QuotaPeakPagedPoolUsage;
128 SIZE_T QuotaPagedPoolUsage;
129 SIZE_T QuotaPeakNonPagedPoolUsage;
130 SIZE_T QuotaNonPagedPoolUsage;
131 SIZE_T PagefileUsage;
132 SIZE_T PeakPagefileUsage;
136 typedef struct _SYSTEM_THREADS {
137 LARGE_INTEGER KernelTime;
138 LARGE_INTEGER UserTime;
139 LARGE_INTEGER CreateTime;
144 KPRIORITY BasePriority;
145 ULONG ContextSwitchCount;
148 } SYSTEM_THREADS, * PSYSTEM_THREADS;
150 typedef struct _SYSTEM_PROCESSES {
151 ULONG NextEntryDelta;
154 LARGE_INTEGER CreateTime;
155 LARGE_INTEGER UserTime;
156 LARGE_INTEGER KernelTime;
157 UNICODE_STRING ProcessName;
158 KPRIORITY BasePriority;
163 ULONG InheritedFromProcessId;
169 ULONG InheritedFromProcessId;
173 VM_COUNTERS VmCounters;
174 #if defined(_WIN64) || _WIN32_WINNT >= 0x500
175 IO_COUNTERS IoCounters;
177 SYSTEM_THREADS Threads[1];
178 } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
182 WindowsMemoryUsageObserver::GetMemoryUsage()
185 MemoryLoadType mem = 0;
187 #if defined(SUPPORT_PSAPI)
188 DWORD pid = GetCurrentProcessId();
189 PROCESS_MEMORY_COUNTERS memoryCounters;
191 HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
195 if (
NULL == hProcess)
201 GetProcessMemoryInfo( hProcess, &memoryCounters,
sizeof(memoryCounters));
203 mem =
static_cast<MemoryLoadType
>(
204 static_cast<double>( memoryCounters.PagefileUsage )
206 #elif defined(SUPPORT_TOOLHELP32)
214 itkGenericExceptionMacro( <<
"Can't find ntdll.dll. "
215 <<
"You should probably disable SUPPORT_TOOLHELP32" );
218 if ( !ZwQuerySystemInformation )
220 itkGenericExceptionMacro( <<
"The file ntdll.dll is not supported. "
221 <<
"You should probably disable SUPPORT_TOOLHELP32" );
225 DWORD pid = GetCurrentProcessId();
227 PSYSTEM_PROCESSES sp =
new SYSTEM_PROCESSES[n];
229 while (ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
230 sp, n *
sizeof *sp, 0)
231 == STATUS_INFO_LENGTH_MISMATCH)
235 sp =
new SYSTEM_PROCESSES[n];
238 for ( PSYSTEM_PROCESSES spp = sp;
240 spp = PSYSTEM_PROCESSES(PCHAR(spp) + spp->NextEntryDelta))
243 if (spp->ProcessId == pid)
245 mem =
static_cast<MemoryLoadType
>(
246 static_cast<double>( spp->VmCounters.PagefileUsage -
sizeof(*sp)) / 1024);
249 done = (spp->NextEntryDelta == 0);
259 MEMORYSTATUSEX statex;
261 statex.dwLength =
sizeof (statex);
263 GlobalMemoryStatusEx (&statex);
265 mem =
static_cast<MemoryLoadType
>(
266 static_cast<double>( statex.ullTotalPhys - statex.ullAvailPhys) / 1024);
277 LinuxMemoryUsageObserver::~LinuxMemoryUsageObserver()
282 LinuxMemoryUsageObserver::GetMemoryUsage()
284 SmapsFileParser<SmapsData_2_6> m_ParseSmaps;
285 m_ParseSmaps.ReadFile();
286 return m_ParseSmaps.GetHeapUsage() + m_ParseSmaps.GetStackUsage();
291 #if defined(__APPLE__) && MAC_OS_X_VERSION >= MAC_OS_X_VERSION_10_2
295 MacOSXMemoryUsageObserver::~MacOSXMemoryUsageObserver()
300 MacOSXMemoryUsageObserver::GetMemoryUsage()
302 VMMapFileParser<VMMapData_10_2> m_ParseVMMmap;
303 m_ParseVMMmap.ReadFile();
304 return m_ParseVMMmap.GetHeapUsage() + m_ParseVMMmap.GetStackUsage();
309 #if defined(__SUNPRO_CC) || defined (__sun__)
313 SunSolarisMemoryUsageObserver::~SunSolarisMemoryUsageObserver()
331 SunSolarisMemoryUsageObserver::GetMemoryUsage()
333 MemoryLoadType mem = 0;
337 std::stringstream command;
338 command <<
"pmap " << pid << std::endl;
340 if ((fp = popen(command.str().c_str(),
"r")) ==
NULL)
342 itkGenericExceptionMacro( <<
"Error using pmap. Can execute pmap command" );
346 fscanf(fp,
"%d:%s",&pmappid,remaining);
350 itkGenericExceptionMacro( <<
"Error using pmap. 1st line output shall be PID: name" );
352 bool heapNotFound =
true;
353 char address[64],perms[32];
358 if ( fscanf(fp,
"%s %dK %s",address, &memUsage, perms) != 3 )
360 if ( fgets(remaining,256,fp) !=
NULL )
363 if ( mapping.find(
"[ heap ]",0) != std::string::npos)
366 heapNotFound =
false;
370 else if ( mapping.find(
"[ ",0) != std::string::npos &&
371 mapping.find(
" ]",0) != std::string::npos )
380 itkGenericExceptionMacro( <<
"Error using pmap. Corrupted pmap output" );
384 if (pclose(fp) == -1)
386 itkGenericExceptionMacro( <<
"Error using pmap. Can't close pmap output file." );
390 #endif //defined(__SUNPRO_CC) || defined (__sun__)
392 #if !defined(WIN32) && !defined(_WIN32) || defined(__OpenBSD__)
406 int who = RUSAGE_SELF;
407 if (getrusage(who, &resourceInfo) == 0)
409 return resourceInfo.ru_ixrss;
415 #if !defined(__APPLE__) && !defined(__SUNPRO_CC) && !defined (__sun__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
426 struct mallinfo minfo = mallinfo();
429 static_cast<double>( minfo.uordblks ) / 1024.0 );
433 #endif // !defined(__APPLE__) && !defined(__SUNPRO_CC) && !defined (__sun__) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
435 #endif // Unix and Mac Platforms !defined(WIN32) && !defined(_WIN32)