| //===-- MemoryGauge.cpp -----------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "MemoryGauge.h" |
| #include <assert.h> |
| #include <mach/mach.h> |
| #include <mach/task.h> |
| #include <mach/mach_traps.h> |
| |
| using namespace lldb_perf; |
| |
| MemoryStats::MemoryStats (mach_vm_size_t virtual_size, |
| mach_vm_size_t resident_size, |
| mach_vm_size_t max_resident_size) : |
| m_virtual_size (virtual_size), |
| m_resident_size (resident_size), |
| m_max_resident_size (max_resident_size) |
| { |
| } |
| |
| MemoryStats::MemoryStats (const MemoryStats& rhs) : |
| m_virtual_size (rhs.m_virtual_size), |
| m_resident_size (rhs.m_resident_size), |
| m_max_resident_size (rhs.m_max_resident_size) |
| { |
| } |
| |
| |
| MemoryStats& |
| MemoryStats::operator = (const MemoryStats& rhs) |
| { |
| if (this != &rhs) |
| { |
| m_virtual_size = rhs.m_virtual_size; |
| m_resident_size = rhs.m_resident_size; |
| m_max_resident_size = rhs.m_max_resident_size; |
| } |
| return *this; |
| } |
| |
| MemoryStats& |
| MemoryStats::operator += (const MemoryStats& rhs) |
| { |
| m_virtual_size += rhs.m_virtual_size; |
| m_resident_size += rhs.m_resident_size; |
| m_max_resident_size += rhs.m_max_resident_size; |
| return *this; |
| } |
| |
| MemoryStats |
| MemoryStats::operator - (const MemoryStats& rhs) |
| { |
| return MemoryStats(m_virtual_size - rhs.m_virtual_size, |
| m_resident_size - rhs.m_resident_size, |
| m_max_resident_size - rhs.m_max_resident_size); |
| } |
| |
| MemoryStats& |
| MemoryStats::operator / (size_t n) |
| { |
| m_virtual_size /= n; |
| m_resident_size /= n; |
| m_max_resident_size /= n; |
| return *this; |
| } |
| |
| MemoryGauge::SizeType |
| MemoryGauge::Now () |
| { |
| task_t task = mach_task_self(); |
| mach_task_basic_info_data_t taskBasicInfo; |
| mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; |
| auto task_info_ret = task_info(task, MACH_TASK_BASIC_INFO, (task_info_t) & taskBasicInfo, &count); |
| if (task_info_ret == KERN_SUCCESS) { |
| return MemoryStats(taskBasicInfo.virtual_size, taskBasicInfo.resident_size, taskBasicInfo.resident_size_max); |
| } |
| return 0; |
| } |
| |
| MemoryGauge::MemoryGauge () : |
| m_start(), |
| m_state(MemoryGauge::State::eNeverUsed) |
| { |
| } |
| |
| void |
| MemoryGauge::Start () |
| { |
| m_state = MemoryGauge::State::eCounting; |
| m_start = Now(); |
| } |
| |
| MemoryGauge::SizeType |
| MemoryGauge::Stop () |
| { |
| auto stop = Now(); |
| assert(m_state == MemoryGauge::State::eCounting && "cannot stop a non-started gauge"); |
| m_state = MemoryGauge::State::eStopped; |
| return (m_value = stop-m_start); |
| } |
| |
| MemoryGauge::SizeType |
| MemoryGauge::GetValue () |
| { |
| assert(m_state == MemoryGauge::State::eStopped && "gauge must be used before you can evaluate it"); |
| return m_value; |
| } |