| // Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_DEVELOPER_MEMORY_METRICS_SUMMARY_H_ | |
| #define SRC_DEVELOPER_MEMORY_METRICS_SUMMARY_H_ | |
| #include <zircon/types.h> | |
| #include <regex> | |
| #include <string> | |
| #include <unordered_map> | |
| #include <unordered_set> | |
| #include <vector> | |
| #include "src/developer/memory/metrics/capture.h" | |
| namespace memory { | |
| struct Sizes { | |
| Sizes() : private_bytes(0), scaled_bytes(0), total_bytes(0) {} | |
| Sizes(uint64_t b) : private_bytes(b), scaled_bytes(b), total_bytes(b) {} | |
| uint64_t private_bytes; | |
| uint64_t scaled_bytes; | |
| uint64_t total_bytes; | |
| }; | |
| class ProcessSummary { | |
| public: | |
| static const zx_koid_t kKernelKoid; | |
| ProcessSummary(zx_koid_t koid, const std::string& name) : koid_(koid), name_(name) {} | |
| ProcessSummary(const zx_info_kmem_stats_t& kmem, uint64_t vmo_bytes); | |
| zx_koid_t koid() const { return koid_; } | |
| const std::string& name() const { return name_; } | |
| const Sizes& sizes() const { return sizes_; } | |
| const std::unordered_map<std::string, Sizes>& name_to_sizes() const { return name_to_sizes_; } | |
| const Sizes& GetSizes(std::string name) const; | |
| private: | |
| zx_koid_t koid_; | |
| std::string name_; | |
| Sizes sizes_; | |
| std::unordered_set<zx_koid_t> vmos_; | |
| std::unordered_map<std::string, Sizes> name_to_sizes_; | |
| friend class Summary; | |
| }; | |
| struct NameMatch { | |
| const std::string regex; | |
| const std::string name; | |
| }; | |
| class Namer { | |
| public: | |
| explicit Namer(const std::vector<const NameMatch>& name_matches); | |
| const std::string& NameForName(const std::string& name); | |
| private: | |
| struct RegexMatch { | |
| std::regex regex; | |
| std::string name; | |
| }; | |
| std::vector<RegexMatch> regex_matches_; | |
| std::unordered_map<std::string, std::string> name_to_name_; | |
| }; | |
| class Summary { | |
| public: | |
| Summary(const Capture& capture, Namer* namer); | |
| explicit Summary(const Capture& capture, const std::vector<const NameMatch>& name_matches = | |
| std::vector<const NameMatch>()); | |
| Summary(const Capture& capture, Namer* namer, | |
| const std::unordered_set<zx_koid_t>& undigested_vmos); | |
| static const std::vector<const NameMatch> kNameMatches; | |
| void SortProcessSummaries(); | |
| zx_time_t time() const { return time_; } | |
| const zx_info_kmem_stats_t& kstats() const { return kstats_; } | |
| const std::vector<ProcessSummary>& process_summaries() const { return process_summaries_; } | |
| private: | |
| void Init(const Capture& capture, Namer* namer, | |
| const std::unordered_set<zx_koid_t>& undigested_vmos); | |
| zx_time_t time_; | |
| zx_info_kmem_stats_t kstats_; | |
| std::vector<ProcessSummary> process_summaries_; | |
| }; | |
| } // namespace memory | |
| #endif // SRC_DEVELOPER_MEMORY_METRICS_SUMMARY_H_ |