MemoryGauge.cpp revision 75fc5a74d95804e2ddc87bcade177640521147e0
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 (mach_vm_size_t virtual_size,
18                          mach_vm_size_t resident_size,
19                          mach_vm_size_t max_resident_size) :
20    m_virtual_size (virtual_size),
21    m_resident_size (resident_size),
22    m_max_resident_size (max_resident_size)
23{
24}
25
26MemoryStats::MemoryStats (const MemoryStats& rhs) :
27    m_virtual_size (rhs.m_virtual_size),
28    m_resident_size (rhs.m_resident_size),
29    m_max_resident_size (rhs.m_max_resident_size)
30{
31}
32
33
34MemoryStats&
35MemoryStats::operator = (const MemoryStats& rhs)
36{
37    if (this != &rhs)
38    {
39        m_virtual_size = rhs.m_virtual_size;
40        m_resident_size = rhs.m_resident_size;
41        m_max_resident_size = rhs.m_max_resident_size;
42    }
43    return *this;
44}
45
46MemoryStats&
47MemoryStats::operator += (const MemoryStats& rhs)
48{
49    m_virtual_size += rhs.m_virtual_size;
50    m_resident_size += rhs.m_resident_size;
51    m_max_resident_size += rhs.m_max_resident_size;
52    return *this;
53}
54
55MemoryStats
56MemoryStats::operator - (const MemoryStats& rhs)
57{
58    return MemoryStats(m_virtual_size - rhs.m_virtual_size,
59                       m_resident_size - rhs.m_resident_size,
60                       m_max_resident_size - rhs.m_max_resident_size);
61}
62
63MemoryStats&
64MemoryStats::operator / (size_t n)
65{
66    m_virtual_size /= n;
67    m_resident_size /= n;
68    m_max_resident_size /= n;
69    return *this;
70}
71
72MemoryGauge::SizeType
73MemoryGauge::Now ()
74{
75    task_t task = mach_task_self();
76    mach_task_basic_info_data_t taskBasicInfo;
77    mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
78    auto task_info_ret = task_info(task, MACH_TASK_BASIC_INFO, (task_info_t) & taskBasicInfo, &count);
79    if (task_info_ret == KERN_SUCCESS) {
80        return MemoryStats(taskBasicInfo.virtual_size, taskBasicInfo.resident_size, taskBasicInfo.resident_size_max);
81    }
82    return 0;
83}
84
85MemoryGauge::MemoryGauge () :
86    m_start(),
87    m_state(MemoryGauge::State::eNeverUsed)
88{
89}
90
91void
92MemoryGauge::Start ()
93{
94	m_state = MemoryGauge::State::eCounting;
95	m_start = Now();
96}
97
98MemoryGauge::SizeType
99MemoryGauge::Stop ()
100{
101	auto stop = Now();
102	assert(m_state == MemoryGauge::State::eCounting && "cannot stop a non-started gauge");
103	m_state = MemoryGauge::State::eStopped;
104	return (m_value = stop-m_start);
105}
106
107MemoryGauge::SizeType
108MemoryGauge::GetValue ()
109{
110	assert(m_state == MemoryGauge::State::eStopped && "gauge must be used before you can evaluate it");
111	return m_value;
112}
113