chrome_graph_processor.cc 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Copyright 2020 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 "services/resource_coordinator/memory_instrumentation/chrome_graph_processor.h"
  5. #include <list>
  6. #include <memory>
  7. #include <string>
  8. #include "services/resource_coordinator/memory_instrumentation/global_dump_graph_converter.h"
  9. #include "services/resource_coordinator/memory_instrumentation/memory_dump_map_converter.h"
  10. namespace memory_instrumentation {
  11. using perfetto::trace_processor::GraphProcessor;
  12. // static
  13. std::unique_ptr<GlobalNodeGraph> ChromeGraphProcessor::CreateMemoryGraph(
  14. const MemoryDumpMap& process_dumps,
  15. Operations operations) {
  16. operations = static_cast<Operations>(
  17. static_cast<std::underlying_type<Operations>::type>(operations) &
  18. ~static_cast<std::underlying_type<Operations>::type>(
  19. Operations::kComputeSharedFootprintFromGraph));
  20. return CreateMemoryGraph(process_dumps, operations, nullptr);
  21. }
  22. // static
  23. std::unique_ptr<GlobalNodeGraph> ChromeGraphProcessor::CreateMemoryGraph(
  24. const MemoryDumpMap& process_dumps,
  25. Operations operations,
  26. std::map<base::ProcessId, uint64_t>* shared_footprints) {
  27. DCHECK(operations == Operations::kNoneOperation ||
  28. operations == Operations::kGraphWithoutSharedFootprint ||
  29. operations == Operations::kAllOperations);
  30. MemoryDumpMapConverter input_converter;
  31. GraphProcessor::RawMemoryNodeMap memory_node_map =
  32. input_converter.Convert(process_dumps);
  33. std::unique_ptr<GlobalNodeGraph> memory_graph =
  34. GraphProcessor::CreateMemoryGraph(memory_node_map);
  35. if (operations == Operations::kGraphWithoutSharedFootprint) {
  36. GraphProcessor::RemoveWeakNodesFromGraph(memory_graph.get());
  37. GraphProcessor::AddOverheadsAndPropagateEntries(memory_graph.get());
  38. GraphProcessor::CalculateSizesForGraph(memory_graph.get());
  39. } else if (operations == Operations::kAllOperations) {
  40. GraphProcessor::RemoveWeakNodesFromGraph(memory_graph.get());
  41. DCHECK(shared_footprints);
  42. shared_footprints->clear();
  43. auto original =
  44. GraphProcessor::ComputeSharedFootprintFromGraph(*memory_graph);
  45. for (const auto& item : original) {
  46. shared_footprints->emplace(static_cast<base::ProcessId>(item.first),
  47. item.second);
  48. }
  49. GraphProcessor::AddOverheadsAndPropagateEntries(memory_graph.get());
  50. GraphProcessor::CalculateSizesForGraph(memory_graph.get());
  51. }
  52. return memory_graph;
  53. }
  54. } // namespace memory_instrumentation