TracySysTime.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "TracySysTime.hpp"
  2. #ifdef TRACY_HAS_SYSTIME
  3. # if defined _WIN32 || defined __CYGWIN__
  4. # include <windows.h>
  5. # elif defined __linux__
  6. # include <stdio.h>
  7. # include <inttypes.h>
  8. # elif defined __APPLE__
  9. # include <mach/mach_host.h>
  10. # include <mach/host_info.h>
  11. # elif defined BSD
  12. # include <sys/types.h>
  13. # include <sys/sysctl.h>
  14. # endif
  15. namespace tracy
  16. {
  17. # if defined _WIN32 || defined __CYGWIN__
  18. static inline uint64_t ConvertTime( const FILETIME& t )
  19. {
  20. return ( uint64_t( t.dwHighDateTime ) << 32 ) | uint64_t( t.dwLowDateTime );
  21. }
  22. void SysTime::ReadTimes()
  23. {
  24. FILETIME idleTime;
  25. FILETIME kernelTime;
  26. FILETIME userTime;
  27. GetSystemTimes( &idleTime, &kernelTime, &userTime );
  28. idle = ConvertTime( idleTime );
  29. const auto kernel = ConvertTime( kernelTime );
  30. const auto user = ConvertTime( userTime );
  31. used = kernel + user;
  32. }
  33. # elif defined __linux__
  34. void SysTime::ReadTimes()
  35. {
  36. uint64_t user, nice, system;
  37. FILE* f = fopen( "/proc/stat", "r" );
  38. if( f )
  39. {
  40. int read = fscanf( f, "cpu %" PRIu64 " %" PRIu64 " %" PRIu64" %" PRIu64, &user, &nice, &system, &idle );
  41. fclose( f );
  42. if (read == 4)
  43. {
  44. used = user + nice + system;
  45. }
  46. }
  47. }
  48. # elif defined __APPLE__
  49. void SysTime::ReadTimes()
  50. {
  51. host_cpu_load_info_data_t info;
  52. mach_msg_type_number_t cnt = HOST_CPU_LOAD_INFO_COUNT;
  53. host_statistics( mach_host_self(), HOST_CPU_LOAD_INFO, reinterpret_cast<host_info_t>( &info ), &cnt );
  54. used = info.cpu_ticks[CPU_STATE_USER] + info.cpu_ticks[CPU_STATE_NICE] + info.cpu_ticks[CPU_STATE_SYSTEM];
  55. idle = info.cpu_ticks[CPU_STATE_IDLE];
  56. }
  57. # elif defined BSD
  58. void SysTime::ReadTimes()
  59. {
  60. u_long data[5];
  61. size_t sz = sizeof( data );
  62. sysctlbyname( "kern.cp_time", &data, &sz, nullptr, 0 );
  63. used = data[0] + data[1] + data[2] + data[3];
  64. idle = data[4];
  65. }
  66. #endif
  67. SysTime::SysTime()
  68. {
  69. ReadTimes();
  70. }
  71. float SysTime::Get()
  72. {
  73. const auto oldUsed = used;
  74. const auto oldIdle = idle;
  75. ReadTimes();
  76. const auto diffIdle = idle - oldIdle;
  77. const auto diffUsed = used - oldUsed;
  78. #if defined _WIN32 || defined __CYGWIN__
  79. return diffUsed == 0 ? -1 : ( diffUsed - diffIdle ) * 100.f / diffUsed;
  80. #elif defined __linux__ || defined __APPLE__ || defined BSD
  81. const auto total = diffUsed + diffIdle;
  82. return total == 0 ? -1 : diffUsed * 100.f / total;
  83. #endif
  84. }
  85. }
  86. #endif