MemoryGauge.cpp revision f5af85a2946ed4e1ff4766829d328cfb4961f259
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  MemoryGauge.cpp
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  PerfTestDriver
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)//  Created by Enrico Granata on 3/6/13.
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)//  Copyright (c) 2013 Apple Inc. All rights reserved.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MemoryGauge.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mach/task.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb::perf;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemoryGauge::SizeType
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemoryGauge::now ()
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles){
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_t task = MACH_PORT_NULL;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mach_task_basic_info_data_t taskBasicInfo;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (task_info(task, MACH_TASK_BASIC_INFO, (task_info_t) & taskBasicInfo, &count) == KERN_SUCCESS) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return taskBasicInfo.virtual_size;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return 0;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemoryGauge::MemoryGauge () :
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)m_start(),
298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)m_state(MemoryGauge::State::eMSNeverUsed)
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles){
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MemoryGauge::start ()
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	m_state = MemoryGauge::State::eMSCounting;
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)	m_start = now();
38}
39
40MemoryGauge::SizeType
41MemoryGauge::stop ()
42{
43	auto stop = now();
44	assert(m_state == MemoryGauge::State::eMSCounting && "cannot stop a non-started gauge");
45	m_state = MemoryGauge::State::eMSStopped;
46	return (m_value = stop-m_start);
47}
48
49MemoryGauge::SizeType
50MemoryGauge::value ()
51{
52	assert(m_state == MemoryGauge::State::eMSStopped && "gauge must be used before you can evaluate it");
53	return m_value;
54}
55