tracy/client/TracySysTime.cpp

109 lines
2.3 KiB
C++
Raw Normal View History

2019-02-21 20:59:02 +00:00
#include "TracySysTime.hpp"
#ifdef TRACY_HAS_SYSTIME
2021-10-07 21:28:40 +00:00
# if defined _WIN32
2019-02-21 20:59:02 +00:00
# include <windows.h>
2019-02-24 18:02:49 +00:00
# elif defined __linux__
# include <stdio.h>
# include <inttypes.h>
2019-02-25 14:04:06 +00:00
# elif defined __APPLE__
# include <mach/mach_host.h>
# include <mach/host_info.h>
2019-11-21 19:37:53 +00:00
# elif defined BSD
# include <sys/types.h>
# include <sys/sysctl.h>
2019-02-21 20:59:02 +00:00
# endif
namespace tracy
{
2021-10-07 21:28:40 +00:00
# if defined _WIN32
2019-02-21 20:59:02 +00:00
static inline uint64_t ConvertTime( const FILETIME& t )
{
return ( uint64_t( t.dwHighDateTime ) << 32 ) | uint64_t( t.dwLowDateTime );
}
2019-02-24 18:02:49 +00:00
void SysTime::ReadTimes()
2019-02-21 20:59:02 +00:00
{
FILETIME idleTime;
FILETIME kernelTime;
FILETIME userTime;
GetSystemTimes( &idleTime, &kernelTime, &userTime );
idle = ConvertTime( idleTime );
const auto kernel = ConvertTime( kernelTime );
const auto user = ConvertTime( userTime );
used = kernel + user;
}
2019-02-24 18:02:49 +00:00
# elif defined __linux__
void SysTime::ReadTimes()
2019-02-21 20:59:02 +00:00
{
2019-02-24 18:02:49 +00:00
uint64_t user, nice, system;
FILE* f = fopen( "/proc/stat", "r" );
2019-04-04 13:25:26 +00:00
if( f )
{
int read = fscanf( f, "cpu %" PRIu64 " %" PRIu64 " %" PRIu64" %" PRIu64, &user, &nice, &system, &idle );
2019-04-04 13:25:26 +00:00
fclose( f );
if (read == 4)
{
used = user + nice + system;
}
2019-04-04 13:25:26 +00:00
}
2019-02-24 18:02:49 +00:00
}
2019-02-21 20:59:02 +00:00
2019-02-25 14:04:06 +00:00
# elif defined __APPLE__
void SysTime::ReadTimes()
{
host_cpu_load_info_data_t info;
mach_msg_type_number_t cnt = HOST_CPU_LOAD_INFO_COUNT;
2021-10-07 21:28:31 +00:00
host_statistics( mach_host_self(), HOST_CPU_LOAD_INFO, reinterpret_cast<host_info_t>( &info ), &cnt );
2019-02-25 14:04:06 +00:00
used = info.cpu_ticks[CPU_STATE_USER] + info.cpu_ticks[CPU_STATE_NICE] + info.cpu_ticks[CPU_STATE_SYSTEM];
idle = info.cpu_ticks[CPU_STATE_IDLE];
}
2019-11-21 19:37:53 +00:00
# elif defined BSD
void SysTime::ReadTimes()
{
u_long data[5];
size_t sz = sizeof( data );
sysctlbyname( "kern.cp_time", &data, &sz, nullptr, 0 );
used = data[0] + data[1] + data[2] + data[3];
idle = data[4];
}
2019-02-24 18:02:49 +00:00
#endif
2019-02-21 20:59:02 +00:00
2019-02-24 18:02:49 +00:00
SysTime::SysTime()
{
ReadTimes();
}
float SysTime::Get()
{
const auto oldUsed = used;
const auto oldIdle = idle;
2019-02-21 20:59:02 +00:00
2019-02-24 18:02:49 +00:00
ReadTimes();
2019-02-21 20:59:02 +00:00
2019-02-24 18:02:49 +00:00
const auto diffIdle = idle - oldIdle;
const auto diffUsed = used - oldUsed;
2019-02-21 20:59:02 +00:00
2021-10-07 21:28:40 +00:00
#if defined _WIN32
return diffUsed == 0 ? -1 : ( diffUsed - diffIdle ) * 100.f / diffUsed;
2019-11-21 19:37:53 +00:00
#elif defined __linux__ || defined __APPLE__ || defined BSD
2019-02-24 18:02:49 +00:00
const auto total = diffUsed + diffIdle;
return total == 0 ? -1 : diffUsed * 100.f / total;
2019-02-24 18:02:49 +00:00
#endif
2019-02-21 20:59:02 +00:00
}
}
#endif