/*--------------------------------------------------------------- getMemoryUsage ---------------------------------------------------------------*/ unsigned long mrpt::system::getMemoryUsage() { MRPT_START unsigned long MEM = 0; #ifdef _WIN32 // Windows: static CAuxPSAPI_Loader PSAPI_LOADER; PROCESS_MEMORY_COUNTERS pmc; pmc.cb = sizeof(pmc); if (PSAPI_LOADER.GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc))) { MEM = (long)pmc.PagefileUsage; } #endif #ifdef MRPT_OS_LINUX FILE* f = ::fopen("/proc/self/statm", "r"); if (!f) return 0; unsigned long mem_pages = 0; // see 'man proc' for docs on this if (!::fscanf(f, "%*d %*d %*d %*d %*d %lu %*d", &mem_pages)) { // Error parsing. MEM = 0; } ::fclose(f); // Multiply by the page size: static const long pagesize = ::sysconf(_SC_PAGE_SIZE); MEM = static_cast<decltype(MEM)>(pagesize) * mem_pages; #endif #ifdef __APPLE__ mach_task_basic_info info; mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; if (task_info( mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &count) == 0) { MEM = info.virtual_size; } #endif return MEM; MRPT_END }
/*--------------------------------------------------------------- getMemoryUsage ---------------------------------------------------------------*/ unsigned long mrpt::system::getMemoryUsage() { MRPT_START unsigned long MEM = 0; #ifdef MRPT_OS_WINDOWS // Windows: static CAuxPSAPI_Loader PSAPI_LOADER; PROCESS_MEMORY_COUNTERS pmc; pmc.cb = sizeof(pmc); if ( PSAPI_LOADER.GetProcessMemoryInfo( GetCurrentProcess(),&pmc,sizeof(pmc) ) ) { MEM = (long)pmc.PagefileUsage; } #endif #ifdef MRPT_OS_LINUX // Linux: //int page_size = getpagesize(); FILE *f = ::fopen ("/proc/self/stat", "r"); if (!f) return 0; // Note: some of these scanf specifiers would normally be 'long' versions if // not for the fact that we are using suppression (gcc warns). see 'man // proc' for scanf specifiers and meanings. if (!::fscanf(f, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*d %*d %*d %*d %*d %*d %*u %lu", &MEM)) { // Error parsing: MEM=0; } ::fclose (f); //::system("cat /proc/self/statm"); #endif #ifdef MRPT_OS_APPLE mach_task_basic_info info; mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; if(task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &count)==0) { MEM=info.virtual_size; } #endif return MEM; MRPT_END }
/*--------------------------------------------------------------- getMemoryUsage ---------------------------------------------------------------*/ unsigned long mrpt::system::getMemoryUsage() { MRPT_START unsigned long MEM = 0; #ifdef MRPT_OS_WINDOWS // Windows: static CAuxPSAPI_Loader PSAPI_LOADER; PROCESS_MEMORY_COUNTERS pmc; pmc.cb = sizeof(pmc); if ( PSAPI_LOADER.GetProcessMemoryInfo( GetCurrentProcess(),&pmc,sizeof(pmc) ) ) { MEM = (long)pmc.PagefileUsage; } #endif #ifdef MRPT_OS_LINUX // Linux: //int page_size = getpagesize(); FILE *f = ::fopen ("/proc/self/stat", "r"); if (!f) return 0; // Note: some of these scanf specifiers would normally be 'long' versions if // not for the fact that we are using suppression (gcc warns). see 'man // proc' for scanf specifiers and meanings. if (!::fscanf(f, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*d %*d %*d %*d %*d %*d %*u %lu", &MEM)) { // Error parsing: MEM=0; } ::fclose (f); //::system("cat /proc/self/statm"); #endif #ifdef MRPT_OS_APPLE //TODO: Not implemented for Apple. MEM = 0; #endif return MEM; MRPT_END }