2014-04-14 14:47:51 -04:00
|
|
|
#include <string>
|
2015-01-04 11:21:20 -05:00
|
|
|
#include <sstream>
|
2014-04-14 14:47:51 -04:00
|
|
|
#include <mach/mach.h>
|
|
|
|
#include <sys/sysctl.h> // for sysctl
|
|
|
|
|
2015-01-12 09:57:41 -05:00
|
|
|
#include "memory.h"
|
2015-01-04 11:21:20 -05:00
|
|
|
#include "../luts.h"
|
|
|
|
|
2014-04-14 14:47:51 -04:00
|
|
|
std::string mem_string( bool use_colors ) {
|
|
|
|
std::ostringstream oss;
|
|
|
|
|
|
|
|
// These values are in bytes
|
|
|
|
int64_t total_mem;
|
|
|
|
int64_t used_mem;
|
|
|
|
int64_t unused_mem;
|
|
|
|
|
|
|
|
vm_size_t page_size;
|
|
|
|
mach_port_t mach_port;
|
|
|
|
mach_msg_type_number_t count;
|
|
|
|
vm_statistics_data_t vm_stats;
|
|
|
|
|
|
|
|
// Get total physical memory
|
|
|
|
int mib[2];
|
|
|
|
mib[0] = CTL_HW;
|
|
|
|
mib[1] = HW_MEMSIZE;
|
|
|
|
size_t length = sizeof(int64_t);
|
|
|
|
sysctl(mib, 2, &total_mem, &length, NULL, 0);
|
|
|
|
|
|
|
|
mach_port = mach_host_self();
|
|
|
|
count = sizeof(vm_stats) / sizeof(natural_t);
|
|
|
|
if (KERN_SUCCESS == host_page_size( mach_port, &page_size) &&
|
|
|
|
KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO,
|
|
|
|
(host_info_t)&vm_stats, &count)) {
|
|
|
|
unused_mem = (int64_t)vm_stats.free_count * (int64_t)page_size;
|
|
|
|
|
|
|
|
used_mem = (
|
|
|
|
(int64_t)vm_stats.active_count +
|
|
|
|
(int64_t)vm_stats.inactive_count +
|
|
|
|
(int64_t)vm_stats.wire_count) *
|
|
|
|
(int64_t)page_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
// To kilobytes
|
|
|
|
used_mem /= 1024;
|
|
|
|
total_mem /= 1024;
|
|
|
|
|
|
|
|
if( use_colors )
|
|
|
|
oss << mem_lut[(100 * used_mem) / total_mem];
|
|
|
|
|
|
|
|
oss << used_mem / 1024 << '/' << total_mem / 1024 << "MB";
|
|
|
|
|
|
|
|
if( use_colors )
|
|
|
|
oss << "#[fg=default,bg=default]";
|
|
|
|
|
|
|
|
return oss.str();
|
|
|
|
}
|