14 #if defined(__GNUC__) && defined(__linux__)
17 #if defined(__APPLE__) && defined(__GNUC__) // Mac OS X
18 #include <mach/mach_init.h>
19 #include <mach/task.h>
20 #elif defined(__FreeBSD__) // FreeBSD
21 #include <sys/resource.h>
23 #elif defined(_MSC_VER) // WINDOWS
37 #if defined(__APPLE__) && defined(__GNUC__) // Mac OS X
39 task_t task = MACH_PORT_NULL;
40 struct task_basic_info t_info;
41 mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
43 if (KERN_SUCCESS != task_info(mach_task_self(), TASK_BASIC_INFO,
44 (task_info_t)&t_info, &t_info_count)) {
47 int64 resident_memory = t_info.resident_size;
48 return resident_memory;
50 #elif defined(__GNUC__) && !defined(__FreeBSD__) // LINUX
54 snprintf(buf,
sizeof(buf),
"/proc/%u/statm", (
unsigned)getpid());
55 FILE*
const pf = fopen(buf,
"r");
57 if (fscanf(pf,
"%u", &size) != 1)
return 0;
60 return size *
int64{1024};
62 #elif defined(__FreeBSD__) // FreeBSD
64 int who = RUSAGE_SELF;
66 getrusage(who, &rusage);
67 return (
int64)(rusage.ru_maxrss *
int64{1024});
69 #elif defined(_MSC_VER) // WINDOWS
72 PROCESS_MEMORY_COUNTERS pmc;
73 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
74 GetCurrentProcessId());
77 if (GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
78 memory = pmc.WorkingSetSize;
80 CloseHandle(hProcess);
84 #else // Unknown, returning 0.