88#define PokemonAutomation_MemoryUtilization_Mac_TPP
99
1010#include < iostream>
11- #include < unistd.h> // For getpid()
1211#include < sys/types.h>
1312#include < sys/sysctl.h>
14- #include < sys/proc_info.h>
15- #include < libproc.h>
1613#include < mach/mach.h>
1714#include < mach/mach_host.h>
1815#include < mach/mach_vm.h>
16+ #include < mach/task_info.h>
1917#include < mach/vm_statistics.h>
2018
2119namespace PokemonAutomation {
@@ -85,18 +83,6 @@ void analyze_vm_regions() {
8583
8684MemoryUsage process_memory_usage (){
8785 MemoryUsage usage;
88-
89- pid_t pid = getpid ();
90- struct proc_taskinfo task_info;
91- int ret = proc_pidinfo (pid, PROC_PIDTASKINFO, 0 , &task_info, sizeof (task_info));
92-
93- if (ret <= 0 ) {
94- std::cerr << " Error getting process info for PID " << pid << " : " << strerror (errno) << std::endl;
95- }else {
96- usage.process_physical_memory = task_info.pti_resident_size ;
97- usage.process_virtual_memory = task_info.pti_virtual_size ;
98- }
99-
10086 int mib[] = {CTL_HW, HW_MEMSIZE};
10187 int64_t physical_memory = 0 ;
10288 size_t length = sizeof (physical_memory);
@@ -107,16 +93,29 @@ MemoryUsage process_memory_usage(){
10793 usage.total_system_memory = physical_memory;
10894 }
10995
110- vm_statistics_data_t vm_stats;
111- mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
112- if (host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t )&vm_stats, &count) != 0 ) {
113- std::cerr << " Failed to get host statistics." << std::endl;
114- } else {
115- // Calculate used memory from vm_statistics
116- // Used = active_count + wire_count
117- // Cached = inactive_count
118- // Buffered = purgeable_count
119- usage.total_used_system_memory = (size_t )(vm_stats.active_count + vm_stats.wire_count ) * (size_t )vm_page_size;
96+ {
97+ task_vm_info_data_t tvi;
98+ mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
99+ if (KERN_SUCCESS == task_info (mach_task_self (), TASK_VM_INFO, (task_info_t ) &tvi, &count))
100+ {
101+ usage.process_physical_memory = tvi.resident_size ;
102+ usage.process_virtual_memory = tvi.virtual_size ;
103+ } else {
104+ std::cerr << " Failed to get task info." << std::endl;
105+ }
106+ }
107+ {
108+ vm_statistics_data_t vm_stats;
109+ mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
110+ if (KERN_SUCCESS == host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t )&vm_stats, &count)) {
111+ // Calculate used memory from vm_statistics
112+ // Used = active_count + wire_count
113+ // Cached = inactive_count
114+ // Buffered = purgeable_count
115+ usage.total_used_system_memory = (size_t )(vm_stats.active_count + vm_stats.wire_count ) * (size_t )vm_page_size;
116+ } else {
117+ std::cerr << " Failed to get host statistics." << std::endl;
118+ }
120119 }
121120 return usage;
122121}
0 commit comments