10#if UNRAVEL_PLATFORM_WINDOWS && (UNRAVEL_COMPILER_MSVC || UNRAVEL_COMPILER_CLANG)
11#define WIN32_LEAN_AND_MEAN
20 PROCESS_MEMORY_COUNTERS pmc{};
22 if(GetProcessMemoryInfo(GetCurrentProcess(), &pmc,
sizeof(pmc)))
24 return static_cast<int64_t
>(pmc.WorkingSetSize);
31 MEMORYSTATUSEX status{};
32 status.dwLength =
sizeof(status);
33 if(GlobalMemoryStatusEx(&status))
35 return static_cast<int64_t
>(status.ullTotalPhys);
42 MEMORYSTATUSEX status{};
43 status.dwLength =
sizeof(status);
44 if(GlobalMemoryStatusEx(&status))
46 return static_cast<int64_t
>(status.ullAvailPhys);
55 if(total > 0 && available >= 0 && available <= total)
57 return total - available;
64#elif UNRAVEL_PLATFORM_LINUX
74 const long page_size = sysconf(_SC_PAGESIZE);
79 FILE*
f = std::fopen(
"/proc/self/statm",
"r");
84 long long total_pages = 0;
85 long long resident_pages = 0;
86 const int n = std::fscanf(f,
"%lld %lld", &total_pages, &resident_pages);
92 return static_cast<int64_t
>(resident_pages * page_size);
97 const long page_size = sysconf(_SC_PAGESIZE);
98 const long num_pages = sysconf(_SC_PHYS_PAGES);
99 if(page_size > 0 && num_pages > 0)
101 return static_cast<int64_t
>(page_size) *
static_cast<int64_t
>(num_pages);
108 FILE*
f = std::fopen(
"/proc/meminfo",
"r");
115 long long mem_available_kb = -1;
116 while(std::fgets(line,
sizeof(line), f) !=
nullptr)
118 if(std::sscanf(line,
"MemAvailable: %lld kB", &mem_available_kb) == 1)
125 if(mem_available_kb < 0)
129 return static_cast<int64_t
>(mem_available_kb) * 1024;
136 if(total > 0 && available >= 0 && available <= total)
138 return total - available;
145#elif UNRAVEL_PLATFORM_OSX
147#include <mach/mach.h>
148#include <mach/task_info.h>
149#include <sys/sysctl.h>
156 task_basic_info info{};
157 mach_msg_type_number_t
count = TASK_BASIC_INFO_COUNT;
158 const kern_return_t kr =
159 task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t
>(&info), &
count);
160 if(kr != KERN_SUCCESS)
164 return static_cast<int64_t
>(info.resident_size);
170 size_t len =
sizeof(mem);
171 if(sysctlbyname(
"hw.memsize", &mem, &len,
nullptr, 0) == 0)
180 vm_statistics64_data_t vm_stats{};
181 mach_msg_type_number_t
count = HOST_VM_INFO64_COUNT;
182 const kern_return_t kr = host_statistics64(mach_host_self(),
184 reinterpret_cast<host_info64_t
>(&vm_stats),
186 if(kr != KERN_SUCCESS)
191 const int64_t page_size =
static_cast<int64_t
>(vm_page_size);
192 const int64_t free_pages =
static_cast<int64_t
>(vm_stats.free_count) +
193 static_cast<int64_t
>(vm_stats.inactive_count) +
194 static_cast<int64_t
>(vm_stats.purgeable_count);
195 return free_pages * page_size;
202 if(total > 0 && available >= 0 && available <= total)
204 return total - available;