2016-02-16 23:21:12 +03:00
|
|
|
#include "profiler/profiler.h"
|
2016-06-20 23:21:54 +03:00
|
|
|
#include "profile_manager.h"
|
2016-02-16 23:21:12 +03:00
|
|
|
#include <ctime>
|
|
|
|
#include <chrono>
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
using namespace profiler;
|
|
|
|
|
2016-08-02 21:18:04 +03:00
|
|
|
#ifdef WIN32
|
|
|
|
struct ProfPerformanceFrequency {
|
|
|
|
LARGE_INTEGER frequency;
|
|
|
|
ProfPerformanceFrequency() { QueryPerformanceFrequency(&frequency); }
|
|
|
|
} const WINDOWS_CPU_INFO;
|
|
|
|
#endif
|
|
|
|
|
2016-08-11 23:52:33 +03:00
|
|
|
BaseBlockData::BaseBlockData(source_id_t _source_id, color_t _color, block_type_t _type, thread_id_t _thread_id)
|
|
|
|
: begin(0)
|
2016-08-02 21:18:04 +03:00
|
|
|
, end(0)
|
|
|
|
, thread_id(_thread_id)
|
2016-08-11 23:52:33 +03:00
|
|
|
#ifndef EASY_USE_OLD_FILE_FORMAT
|
|
|
|
, source_id(_source_id)
|
|
|
|
#endif
|
|
|
|
, type(_type)
|
|
|
|
, color(_color)
|
2016-02-20 05:24:12 +03:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-08-11 23:52:33 +03:00
|
|
|
Block::Block(const char* _name, color_t _color, block_type_t _type, source_id_t _source_id)
|
|
|
|
: Block(_name, getCurrentThreadId(), _color, _type, _source_id)
|
2016-02-16 23:21:12 +03:00
|
|
|
{
|
2016-08-02 21:18:04 +03:00
|
|
|
}
|
|
|
|
|
2016-08-11 23:52:33 +03:00
|
|
|
Block::Block(const char* _name, thread_id_t _thread_id, color_t _color, block_type_t _type, source_id_t _source_id)
|
|
|
|
: BaseBlockData(_source_id, _color, _type, _thread_id)
|
2016-08-14 22:22:44 +03:00
|
|
|
, m_name(_name)
|
2016-08-02 21:18:04 +03:00
|
|
|
{
|
|
|
|
tick(begin);
|
|
|
|
if (BLOCK_TYPE_BLOCK != this->type)
|
|
|
|
{
|
|
|
|
end = begin;
|
|
|
|
}
|
2016-02-16 23:21:12 +03:00
|
|
|
}
|
|
|
|
|
2016-07-31 19:20:58 +03:00
|
|
|
inline timestamp_t getCurrentTime()
|
|
|
|
{
|
|
|
|
#ifdef WIN32
|
|
|
|
//see https://msdn.microsoft.com/library/windows/desktop/dn553408(v=vs.85).aspx
|
|
|
|
LARGE_INTEGER elapsedMicroseconds;
|
|
|
|
if (!QueryPerformanceCounter(&elapsedMicroseconds))
|
|
|
|
return 0;
|
2016-08-01 22:16:31 +03:00
|
|
|
elapsedMicroseconds.QuadPart *= 1000000000LL;
|
2016-08-02 21:18:04 +03:00
|
|
|
elapsedMicroseconds.QuadPart /= WINDOWS_CPU_INFO.frequency.QuadPart;
|
2016-07-31 19:20:58 +03:00
|
|
|
return (timestamp_t)elapsedMicroseconds.QuadPart;
|
|
|
|
#else
|
2016-07-31 20:01:02 +03:00
|
|
|
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> time_point;
|
|
|
|
time_point = std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now());
|
2016-07-31 19:20:58 +03:00
|
|
|
return time_point.time_since_epoch().count();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-03-03 14:55:38 +03:00
|
|
|
void BaseBlockData::tick(timestamp_t& stamp)
|
2016-02-16 23:21:12 +03:00
|
|
|
{
|
2016-07-31 19:20:58 +03:00
|
|
|
stamp = getCurrentTime();
|
2016-02-16 23:21:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
Block::~Block()
|
|
|
|
{
|
2016-02-20 05:24:12 +03:00
|
|
|
if (this->type == BLOCK_TYPE_BLOCK)
|
|
|
|
{
|
|
|
|
if (this->isCleared())//this block was cleared by END_BLOCK macros
|
|
|
|
return;
|
|
|
|
if (!this->isFinished())
|
|
|
|
this->finish();
|
|
|
|
|
|
|
|
endBlock();
|
|
|
|
}
|
2016-02-16 23:25:12 +03:00
|
|
|
}
|