performance_manager_lifetime.cc 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/performance_manager/embedder/performance_manager_lifetime.h"
  5. #include "base/bind.h"
  6. #include "base/no_destructor.h"
  7. #include "base/notreached.h"
  8. #include "components/performance_manager/decorators/frame_visibility_decorator.h"
  9. #include "components/performance_manager/decorators/page_load_tracker_decorator.h"
  10. #include "components/performance_manager/embedder/graph_features.h"
  11. #include "components/performance_manager/execution_context/execution_context_registry_impl.h"
  12. #include "components/performance_manager/graph/frame_node_impl_describer.h"
  13. #include "components/performance_manager/graph/page_node_impl_describer.h"
  14. #include "components/performance_manager/graph/process_node_impl_describer.h"
  15. #include "components/performance_manager/graph/worker_node_impl_describer.h"
  16. #include "components/performance_manager/performance_manager_impl.h"
  17. #include "components/performance_manager/public/decorators/page_live_state_decorator.h"
  18. #include "components/performance_manager/public/graph/graph.h"
  19. #include "components/performance_manager/v8_memory/v8_context_tracker.h"
  20. namespace performance_manager {
  21. namespace {
  22. GraphCreatedCallback* GetAdditionalGraphCreatedCallback() {
  23. static base::NoDestructor<GraphCreatedCallback>
  24. additional_graph_created_callback;
  25. return additional_graph_created_callback.get();
  26. }
  27. absl::optional<GraphFeatures>* GetGraphFeaturesOverride() {
  28. static absl::optional<GraphFeatures> graph_features_override;
  29. return &graph_features_override;
  30. }
  31. void OnGraphCreated(const GraphFeatures& graph_features,
  32. GraphCreatedCallback external_graph_created_callback,
  33. GraphImpl* graph) {
  34. auto graph_features_override = *GetGraphFeaturesOverride();
  35. const GraphFeatures& configured_features =
  36. graph_features_override ? *graph_features_override : graph_features;
  37. // Install required features on the graph.
  38. configured_features.ConfigureGraph(graph);
  39. // Run graph created callbacks.
  40. std::move(external_graph_created_callback).Run(graph);
  41. if (*GetAdditionalGraphCreatedCallback())
  42. std::move(*GetAdditionalGraphCreatedCallback()).Run(graph);
  43. }
  44. } // namespace
  45. PerformanceManagerLifetime::PerformanceManagerLifetime(
  46. const GraphFeatures& graph_features,
  47. GraphCreatedCallback graph_created_callback)
  48. : performance_manager_(PerformanceManagerImpl::Create(
  49. base::BindOnce(&OnGraphCreated,
  50. graph_features,
  51. std::move(graph_created_callback)))),
  52. performance_manager_registry_(
  53. performance_manager::PerformanceManagerRegistry::Create()) {}
  54. PerformanceManagerLifetime::~PerformanceManagerLifetime() {
  55. // There may still be worker hosts, WebContents and RenderProcessHosts with
  56. // attached user data, retaining WorkerNodes, PageNodes, FrameNodes and
  57. // ProcessNodes. Tear down the registry to release these nodes.
  58. performance_manager_registry_->TearDown();
  59. performance_manager_registry_.reset();
  60. performance_manager::DestroyPerformanceManager(
  61. std::move(performance_manager_));
  62. }
  63. // static
  64. void PerformanceManagerLifetime::SetAdditionalGraphCreatedCallbackForTesting(
  65. GraphCreatedCallback graph_created_callback) {
  66. *GetAdditionalGraphCreatedCallback() = std::move(graph_created_callback);
  67. }
  68. // static
  69. void PerformanceManagerLifetime::SetGraphFeaturesOverrideForTesting(
  70. const GraphFeatures& graph_features_override) {
  71. *GetGraphFeaturesOverride() = graph_features_override;
  72. }
  73. void DestroyPerformanceManager(std::unique_ptr<PerformanceManager> instance) {
  74. PerformanceManagerImpl::Destroy(std::move(instance));
  75. }
  76. } // namespace performance_manager