cmInstrumentation.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include "cmConfigure.h" // IWYU pragma: keep
  5. #include <chrono>
  6. #include <functional>
  7. #include <map>
  8. #include <set>
  9. #include <string>
  10. #include <vector>
  11. #include <cm/memory>
  12. #include <cm/optional>
  13. #include <cm3p/json/value.h>
  14. #include <stddef.h>
  15. #include "cmFileLock.h"
  16. #ifndef CMAKE_BOOTSTRAP
  17. # include <cmsys/SystemInformation.hxx>
  18. #endif
  19. #include <stdint.h>
  20. #include "cmInstrumentationQuery.h"
  21. class cmInstrumentation
  22. {
  23. public:
  24. enum class LoadQueriesAfter
  25. {
  26. Yes,
  27. No
  28. };
  29. cmInstrumentation(std::string const& binary_dir,
  30. LoadQueriesAfter loadQueries = LoadQueriesAfter::Yes);
  31. void LoadQueries();
  32. void CheckCDashVariable();
  33. int InstrumentCommand(
  34. std::string command_type, std::vector<std::string> const& command,
  35. std::function<int()> const& callback,
  36. cm::optional<std::map<std::string, std::string>> options = cm::nullopt,
  37. cm::optional<std::map<std::string, std::string>> arrayOptions =
  38. cm::nullopt,
  39. LoadQueriesAfter reloadQueriesAfterCommand = LoadQueriesAfter::No);
  40. std::string InstrumentTest(std::string const& name,
  41. std::string const& command,
  42. std::vector<std::string> const& args,
  43. int64_t result,
  44. std::chrono::steady_clock::time_point steadyStart,
  45. std::chrono::system_clock::time_point systemStart,
  46. std::string config);
  47. void GetPreTestStats();
  48. bool HasQuery() const;
  49. bool HasOption(cmInstrumentationQuery::Option option) const;
  50. bool HasHook(cmInstrumentationQuery::Hook hook) const;
  51. bool HasPreOrPostBuildHook() const;
  52. bool ReadJSONQueries(std::string const& directory);
  53. void ReadJSONQuery(std::string const& file);
  54. void WriteJSONQuery(std::set<cmInstrumentationQuery::Option> const& options,
  55. std::set<cmInstrumentationQuery::Hook> const& hooks,
  56. std::vector<std::vector<std::string>> const& callback);
  57. void AddCustomContent(std::string const& name, Json::Value const& contents);
  58. void WriteCustomContent();
  59. void ClearGeneratedQueries();
  60. int CollectTimingData(cmInstrumentationQuery::Hook hook);
  61. int SpawnBuildDaemon();
  62. bool LockBuildDaemon();
  63. int CollectTimingAfterBuild(int ppid);
  64. void AddHook(cmInstrumentationQuery::Hook hook);
  65. void AddOption(cmInstrumentationQuery::Option option);
  66. bool HasErrors() const;
  67. std::string const& GetCDashDir();
  68. private:
  69. Json::Value ReadJsonSnippet(std::string const& directory,
  70. std::string const& file_name);
  71. void WriteInstrumentationJson(Json::Value& index,
  72. std::string const& directory,
  73. std::string const& file_name);
  74. void InsertStaticSystemInformation(Json::Value& index);
  75. void GetDynamicSystemInformation(double& memory, double& load);
  76. void InsertDynamicSystemInformation(Json::Value& index,
  77. std::string const& instant);
  78. void InsertTimingData(Json::Value& root,
  79. std::chrono::steady_clock::time_point steadyStart,
  80. std::chrono::system_clock::time_point systemStart);
  81. bool HasQueryFile(std::string const& file);
  82. static std::string GetCommandStr(std::vector<std::string> const& args);
  83. static std::string ComputeSuffixHash(std::string const& command_str);
  84. static std::string ComputeSuffixTime();
  85. void PrepareDataForCDash(std::string const& data_dir,
  86. std::string const& index_path);
  87. void RemoveOldFiles(std::string const& dataSubdir);
  88. void WriteTraceFile(Json::Value const& index, std::string const& trace_name);
  89. void AppendTraceEvent(Json::Value& trace, std::vector<uint64_t>& workers,
  90. Json::Value const& snippetData);
  91. size_t AssignTargetToTraceThread(std::vector<uint64_t>& workers,
  92. uint64_t timeStart, uint64_t duration);
  93. std::string GetLatestFile(std::string const& dataSubdir,
  94. std::string const& exclude = "");
  95. std::string binaryDir;
  96. std::string timingDirv1;
  97. std::string userTimingDirv1;
  98. std::string cdashDir;
  99. std::set<cmInstrumentationQuery::Option> options;
  100. std::set<cmInstrumentationQuery::Hook> hooks;
  101. std::vector<std::string> callbacks;
  102. std::vector<std::string> queryFiles;
  103. static std::map<std::string, std::string> cdashSnippetsMap;
  104. Json::Value preTestStats;
  105. std::string errorMsg;
  106. bool hasQuery = false;
  107. bool ranSystemChecks = false;
  108. bool ranOSCheck = false;
  109. Json::Value customContent;
  110. #ifndef CMAKE_BOOTSTRAP
  111. std::unique_ptr<cmsys::SystemInformation> systemInformation;
  112. cmsys::SystemInformation& GetSystemInformation();
  113. #endif
  114. int writtenJsonQueries = 0;
  115. cmFileLock lock;
  116. };