MemoryGauge.cpp revision 53bba61c0b9f3b3ceff5835f79d61efa0d81847c
1// 2// MemoryGauge.cpp 3// PerfTestDriver 4// 5// Created by Enrico Granata on 3/6/13. 6// Copyright (c) 2013 Apple Inc. All rights reserved. 7// 8 9#include "MemoryGauge.h" 10#include <assert.h> 11#include <mach/mach.h> 12#include <mach/task.h> 13#include <mach/mach_traps.h> 14 15using namespace lldb_perf; 16 17MemoryStats::MemoryStats () : MemoryStats(0,0,0) {} 18MemoryStats::MemoryStats (mach_vm_size_t vs,mach_vm_size_t rs, mach_vm_size_t mrs) : 19m_virtual_size(vs), 20m_resident_size(rs), 21m_max_resident_size(mrs) 22{} 23 24MemoryStats::MemoryStats (const MemoryStats& rhs) : MemoryStats(rhs.m_virtual_size,rhs.m_resident_size,rhs.m_max_resident_size) 25{} 26 27MemoryStats& 28MemoryStats::operator = (const MemoryStats& rhs) 29{ 30 if (&rhs != this) 31 { 32 m_virtual_size = rhs.m_virtual_size; 33 m_resident_size = rhs.m_resident_size; 34 m_max_resident_size = rhs.m_max_resident_size; 35 } 36 return *this; 37} 38 39MemoryStats& 40MemoryStats::operator += (const MemoryStats& rhs) 41{ 42 m_virtual_size += rhs.m_virtual_size; 43 m_resident_size += rhs.m_resident_size; 44 m_max_resident_size += rhs.m_max_resident_size; 45 return *this; 46} 47 48MemoryStats 49MemoryStats::operator - (const MemoryStats& rhs) 50{ 51 return MemoryStats(m_virtual_size - rhs.m_virtual_size, 52 m_resident_size - rhs.m_resident_size, 53 m_max_resident_size - rhs.m_max_resident_size); 54} 55 56MemoryStats& 57MemoryStats::operator / (size_t rhs) 58{ 59 m_virtual_size /= rhs; 60 m_resident_size /= rhs; 61 m_max_resident_size /= rhs; 62 return *this; 63} 64 65MemoryGauge::SizeType 66MemoryGauge::now () 67{ 68 task_t task = mach_task_self(); 69 mach_task_basic_info_data_t taskBasicInfo; 70 mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; 71 auto task_info_ret = task_info(task, MACH_TASK_BASIC_INFO, (task_info_t) & taskBasicInfo, &count); 72 if (task_info_ret == KERN_SUCCESS) { 73 return MemoryStats(taskBasicInfo.virtual_size, taskBasicInfo.resident_size, taskBasicInfo.resident_size_max); 74 } 75 return 0; 76} 77 78MemoryGauge::MemoryGauge () : 79m_start(), 80m_state(MemoryGauge::State::eMSNeverUsed) 81{ 82} 83 84void 85MemoryGauge::start () 86{ 87 m_state = MemoryGauge::State::eMSCounting; 88 m_start = now(); 89} 90 91MemoryGauge::SizeType 92MemoryGauge::stop () 93{ 94 auto stop = now(); 95 assert(m_state == MemoryGauge::State::eMSCounting && "cannot stop a non-started gauge"); 96 m_state = MemoryGauge::State::eMSStopped; 97 return (m_value = stop-m_start); 98} 99 100MemoryGauge::SizeType 101MemoryGauge::value () 102{ 103 assert(m_state == MemoryGauge::State::eMSStopped && "gauge must be used before you can evaluate it"); 104 return m_value; 105} 106