cmInstrumentation.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 ClearGeneratedQueries();
  57. int CollectTimingData(cmInstrumentationQuery::Hook hook);
  58. int SpawnBuildDaemon();
  59. bool LockBuildDaemon();
  60. int CollectTimingAfterBuild(int ppid);
  61. void AddHook(cmInstrumentationQuery::Hook hook);
  62. void AddOption(cmInstrumentationQuery::Option option);
  63. bool HasErrors() const;
  64. std::string const& GetCDashDir();
  65. private:
  66. void WriteInstrumentationJson(Json::Value& index,
  67. std::string const& directory,
  68. std::string const& file_name);
  69. void InsertStaticSystemInformation(Json::Value& index);
  70. void GetDynamicSystemInformation(double& memory, double& load);
  71. void InsertDynamicSystemInformation(Json::Value& index,
  72. std::string const& instant);
  73. void InsertTimingData(Json::Value& root,
  74. std::chrono::steady_clock::time_point steadyStart,
  75. std::chrono::system_clock::time_point systemStart);
  76. bool HasQueryFile(std::string const& file);
  77. static std::string GetCommandStr(std::vector<std::string> const& args);
  78. static std::string ComputeSuffixHash(std::string const& command_str);
  79. static std::string ComputeSuffixTime();
  80. void PrepareDataForCDash(std::string const& data_dir,
  81. std::string const& index_path);
  82. std::string binaryDir;
  83. std::string timingDirv1;
  84. std::string userTimingDirv1;
  85. std::string cdashDir;
  86. std::set<cmInstrumentationQuery::Option> options;
  87. std::set<cmInstrumentationQuery::Hook> hooks;
  88. std::vector<std::string> callbacks;
  89. std::vector<std::string> queryFiles;
  90. static std::map<std::string, std::string> cdashSnippetsMap;
  91. Json::Value preTestStats;
  92. std::string errorMsg;
  93. bool hasQuery = false;
  94. bool ranSystemChecks = false;
  95. bool ranOSCheck = false;
  96. #ifndef CMAKE_BOOTSTRAP
  97. std::unique_ptr<cmsys::SystemInformation> systemInformation;
  98. cmsys::SystemInformation& GetSystemInformation();
  99. #endif
  100. int writtenJsonQueries = 0;
  101. cmFileLock lock;
  102. };