18 #include <sys/resource.h>
23 #include <mach/mach_init.h>
24 #include <mach/mach_port.h>
25 #include <mach/task.h>
26 #include <mach/task_info.h>
28 int mem_stat_setup(
void)
33 size_t mem_stat_rss_current_get(
void)
35 struct mach_task_basic_info info;
36 mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
37 if (__builtin_expect(task_info(mach_task_self(), MACH_TASK_BASIC_INFO,
38 (task_info_t)&info, &count) != KERN_SUCCESS, 0))
40 return (
size_t)info.resident_size;
43 #elif defined(__LINUX)
49 static int proc_stat_fd;
50 static long linux_page_size;
52 int mem_stat_setup(
void)
54 proc_stat_fd = open(
"/proc/self/statm", O_RDONLY);
55 if (proc_stat_fd == -1)
58 linux_page_size = sysconf(_SC_PAGESIZE);
62 size_t mem_stat_rss_current_get(
void)
65 if (__builtin_expect(lseek(proc_stat_fd, 0, SEEK_SET) == -1 ||
66 read(proc_stat_fd, res,
sizeof(res) - 1) == -1, 0))
69 res[
sizeof(res) - 1] =
'\0';
72 while (res[i] && !isspace(res[i])) {
76 return (
size_t)(strtoull(&res[i], NULL, 10) * linux_page_size);
81 int mem_stat_setup(
void)
86 size_t mem_stat_rss_current_get(
void)
93 size_t mem_stat_rss_max_get(
void)
96 getrusage(RUSAGE_SELF, &res);
99 return (
size_t)res.ru_maxrss;
101 return (
size_t)res.ru_maxrss * 1024;
112 int mem_stat_setup(
void)
117 size_t mem_stat_rss_current_get(
void)
119 PROCESS_MEMORY_COUNTERS info;
120 GetProcessMemoryInfo(GetCurrentProcess(), &info,
sizeof(info));
121 return (
size_t)info.WorkingSetSize;
124 size_t mem_stat_rss_max_get(
void)
126 PROCESS_MEMORY_COUNTERS info;
127 GetProcessMemoryInfo(GetCurrentProcess(), &info,
sizeof(info));
128 return (
size_t)info.PeakWorkingSetSize;