| 87 | u32 xrMemory::mem_usage(u32* pBlocksUsed, u32* pBlocksFree) { return u32(mem_usage_impl(pBlocksUsed, pBlocksFree)); } |
| 88 | |
| 89 | void GetProcessMemInfo(SProcessMemInfo& minfo) |
| 90 | { |
| 91 | std::memset(&minfo, 0, sizeof(SProcessMemInfo)); |
| 92 | |
| 93 | MEMORYSTATUSEX mem; |
| 94 | mem.dwLength = sizeof(mem); |
| 95 | GlobalMemoryStatusEx(&mem); |
| 96 | |
| 97 | minfo.TotalPhysicalMemory = mem.ullTotalPhys; |
| 98 | minfo.FreePhysicalMemory = mem.ullAvailPhys; |
| 99 | |
| 100 | minfo.TotalPageFile = mem.ullTotalPageFile - mem.ullTotalPhys; |
| 101 | |
| 102 | if (minfo.TotalPageFile > 0l) |
| 103 | { |
| 104 | // эта херня погоду показывает на самом деле. надо найти способ как получить свободный размер файла подкачки |
| 105 | minfo.FreePageFile = mem.ullAvailPageFile > mem.ullAvailPhys ? mem.ullAvailPageFile - mem.ullAvailPhys : mem.ullAvailPageFile; |
| 106 | } |
| 107 | |
| 108 | minfo.MemoryLoad = mem.dwMemoryLoad; |
| 109 | |
| 110 | PROCESS_MEMORY_COUNTERS pc; |
| 111 | std::memset(&pc, 0, sizeof(PROCESS_MEMORY_COUNTERS)); |
| 112 | pc.cb = sizeof(pc); |
| 113 | if (GetProcessMemoryInfo(GetCurrentProcess(), &pc, sizeof(pc))) |
| 114 | { |
| 115 | minfo.WorkingSetSize = pc.WorkingSetSize; |
| 116 | minfo.PeakWorkingSetSize = pc.PeakWorkingSetSize; |
| 117 | |
| 118 | minfo.PagefileUsage = pc.PagefileUsage; |
| 119 | minfo.PeakPagefileUsage = pc.PeakPagefileUsage; |
| 120 | } |
| 121 | |
| 122 | #ifdef USE_MIMALLOC |
| 123 | Log("####################[+MIMALLOC+]####################"); |
| 124 | mi_stats_print_out( |
| 125 | [](const char* msg, void*) { |
| 126 | std::string str{msg}; |
| 127 | xr_string_utils::rtrim(str); |
| 128 | Log(str); |
| 129 | }, |
| 130 | nullptr); |
| 131 | Log("####################[-MIMALLOC-]####################"); |
| 132 | #endif |
| 133 | } |
| 134 | |
| 135 | size_t mem_usage_impl(u32* pBlocksUsed, u32* pBlocksFree) |
| 136 | { |
no test coverage detected