cmInstrumentation.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 "cmFileLock.h"
  15. #ifndef CMAKE_BOOTSTRAP
  16. # include <cmsys/SystemInformation.hxx>
  17. #endif
  18. #include <stdint.h>
  19. #include "cmInstrumentationQuery.h"
  20. class cmInstrumentation
  21. {
  22. public:
  23. enum class LoadQueriesAfter
  24. {
  25. Yes,
  26. No
  27. };
  28. cmInstrumentation(std::string const& binary_dir,
  29. LoadQueriesAfter loadQueries = LoadQueriesAfter::Yes);
  30. void LoadQueries();
  31. void CheckCDashVariable();
  32. int InstrumentCommand(
  33. std::string command_type, std::vector<std::string> const& command,
  34. std::function<int()> const& callback,
  35. cm::optional<std::map<std::string, std::string>> options = cm::nullopt,
  36. cm::optional<std::map<std::string, std::string>> arrayOptions =
  37. cm::nullopt,
  38. LoadQueriesAfter reloadQueriesAfterCommand = LoadQueriesAfter::No);
  39. std::string InstrumentTest(std::string const& name,
  40. std::string const& command,
  41. std::vector<std::string> const& args,
  42. int64_t result,
  43. std::chrono::steady_clock::time_point steadyStart,
  44. std::chrono::system_clock::time_point systemStart,
  45. std::string config);
  46. void GetPreTestStats();
  47. bool HasQuery() const;
  48. bool HasOption(cmInstrumentationQuery::Option option) const;
  49. bool HasHook(cmInstrumentationQuery::Hook hook) const;
  50. bool HasPreOrPostBuildHook() const;
  51. bool ReadJSONQueries(std::string const& directory);
  52. void ReadJSONQuery(std::string const& file);
  53. void WriteJSONQuery(std::set<cmInstrumentationQuery::Option> const& options,
  54. std::set<cmInstrumentationQuery::Hook> const& hooks,
  55. std::vector<std::vector<std::string>> const& callback);
  56. void AddCustomContent(std::string const& name, Json::Value const& contents);
  57. void WriteCustomContent();
  58. std::string GetLatestContentFile();
  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. void WriteInstrumentationJson(Json::Value& index,
  70. std::string const& directory,
  71. std::string const& file_name);
  72. void InsertStaticSystemInformation(Json::Value& index);
  73. void GetDynamicSystemInformation(double& memory, double& load);
  74. void InsertDynamicSystemInformation(Json::Value& index,
  75. std::string const& instant);
  76. void InsertTimingData(Json::Value& root,
  77. std::chrono::steady_clock::time_point steadyStart,
  78. std::chrono::system_clock::time_point systemStart);
  79. bool HasQueryFile(std::string const& file);
  80. static std::string GetCommandStr(std::vector<std::string> const& args);
  81. static std::string ComputeSuffixHash(std::string const& command_str);
  82. static std::string ComputeSuffixTime();
  83. void PrepareDataForCDash(std::string const& data_dir,
  84. std::string const& index_path);
  85. std::string binaryDir;
  86. std::string timingDirv1;
  87. std::string userTimingDirv1;
  88. std::string cdashDir;
  89. std::set<cmInstrumentationQuery::Option> options;
  90. std::set<cmInstrumentationQuery::Hook> hooks;
  91. std::vector<std::string> callbacks;
  92. std::vector<std::string> queryFiles;
  93. static std::map<std::string, std::string> cdashSnippetsMap;
  94. Json::Value preTestStats;
  95. std::string errorMsg;
  96. bool hasQuery = false;
  97. bool ranSystemChecks = false;
  98. bool ranOSCheck = false;
  99. Json::Value customContent;
  100. #ifndef CMAKE_BOOTSTRAP
  101. std::unique_ptr<cmsys::SystemInformation> systemInformation;
  102. cmsys::SystemInformation& GetSystemInformation();
  103. #endif
  104. int writtenJsonQueries = 0;
  105. cmFileLock lock;
  106. };