11#include " stdafx.h"
22
3+ #if defined(WINDOWS)
34#include < Psapi.h>
5+ #elif defined(LINUX)
6+ #include < sys/sysinfo.h>
7+ #include < sys/time.h>
8+ #include < sys/resource.h>
9+ #endif
410
511xrMemory Memory;
612// Also used in src\xrCore\xrDebug.cpp to prevent use of g_pStringContainer before it initialized
@@ -27,6 +33,7 @@ void xrMemory::_destroy()
2733
2834XRCORE_API void vminfo (size_t * _free, size_t * reserved, size_t * committed)
2935{
36+ #if defined(WINDOWS)
3037 MEMORY_BASIC_INFORMATION memory_info;
3138 memory_info.BaseAddress = 0 ;
3239 *_free = *reserved = *committed = 0 ;
@@ -40,6 +47,13 @@ XRCORE_API void vminfo(size_t* _free, size_t* reserved, size_t* committed)
4047 }
4148 memory_info.BaseAddress = (char *)memory_info.BaseAddress + memory_info.RegionSize ;
4249 }
50+ #elif defined(LINUX)
51+ struct sysinfo si;
52+ sysinfo (&si);
53+ *_free = si.freeram * si.mem_unit ;
54+ *reserved = si.bufferram * si.mem_unit ;
55+ *committed = (si.totalram - si.freeram + si.totalswap - si.freeswap ) * si.mem_unit ;
56+ #endif
4357}
4458
4559XRCORE_API void log_vminfo ()
@@ -51,19 +65,28 @@ XRCORE_API void log_vminfo()
5165
5266size_t xrMemory::mem_usage ()
5367{
68+ #if defined(WINDOWS)
5469 PROCESS_MEMORY_COUNTERS pmc = {};
5570 if (HANDLE h = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE , GetCurrentProcessId ()))
5671 {
5772 GetProcessMemoryInfo (h, &pmc, sizeof (pmc));
5873 CloseHandle (h);
5974 }
6075 return pmc.PagefileUsage ;
76+ #elif defined(LINUX)
77+ struct rusage ru;
78+ getrusage (RUSAGE_SELF, &ru);
79+ return (size_t )ru.ru_maxrss ;
80+ #endif
6181}
6282
6383void xrMemory::mem_compact ()
6484{
85+ #if defined(WINDOWS)
6586 RegFlushKey (HKEY_CLASSES_ROOT);
6687 RegFlushKey (HKEY_CURRENT_USER);
88+ #endif
89+
6790 /*
6891 Следующие две команды в целом не нужны.
6992 Современные аллокаторы достаточно грамотно и когда нужно возвращают память операционной системе.
@@ -77,8 +100,11 @@ void xrMemory::mem_compact()
77100 g_pStringContainer->clean ();
78101 if (g_pSharedMemoryContainer)
79102 g_pSharedMemoryContainer->clean ();
80- if (strstr (Core.Params , " -swap_on_compact" ))
103+
104+ #if defined(WINDOWS)
105+ if (strstr (Core.Params , " -swap_on_compact" ))
81106 SetProcessWorkingSetSize (GetCurrentProcess (), size_t (-1 ), size_t (-1 ));
107+ #endif
82108}
83109
84110// xr_strdup
0 commit comments