| // Copyright 2015 The Chromium 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 BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_ |
| #define BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <ostream> |
| #include <string> |
| |
| #include "base/base_export.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/optional.h" |
| #include "base/trace_event/memory_allocator_dump_guid.h" |
| #include "base/trace_event/memory_dump_request_args.h" |
| #include "base/trace_event/trace_event_argument.h" |
| #include "base/unguessable_token.h" |
| #include "base/values.h" |
| |
| namespace base { |
| namespace trace_event { |
| |
| class ProcessMemoryDump; |
| class TracedValue; |
| |
| // Data model for user-land memory allocator dumps. |
| class BASE_EXPORT MemoryAllocatorDump { |
| public: |
| enum Flags { |
| DEFAULT = 0, |
| |
| // A dump marked weak will be discarded by TraceViewer. |
| WEAK = 1 << 0, |
| }; |
| |
| // In the TraceViewer UI table each MemoryAllocatorDump becomes |
| // a row and each Entry generates a column (if it doesn't already |
| // exist). |
| struct BASE_EXPORT Entry { |
| enum EntryType { |
| kUint64, |
| kString, |
| }; |
| |
| // By design name, units and value_string are always coming from |
| // indefinitely lived const char* strings, the only reason we copy |
| // them into a std::string is to handle Mojo (de)serialization. |
| // TODO(hjd): Investigate optimization (e.g. using StringPiece). |
| Entry(); // Only for deserialization. |
| Entry(std::string name, std::string units, uint64_t value); |
| Entry(std::string name, std::string units, std::string value); |
| Entry(Entry&& other) noexcept; |
| Entry& operator=(Entry&& other); |
| bool operator==(const Entry& rhs) const; |
| |
| std::string name; |
| std::string units; |
| |
| EntryType entry_type; |
| |
| uint64_t value_uint64; |
| std::string value_string; |
| |
| DISALLOW_COPY_AND_ASSIGN(Entry); |
| }; |
| |
| MemoryAllocatorDump(const std::string& absolute_name, |
| MemoryDumpLevelOfDetail, |
| const MemoryAllocatorDumpGuid&); |
| ~MemoryAllocatorDump(); |
| |
| // Standard attribute |name|s for the AddScalar and AddString() methods. |
| static const char kNameSize[]; // To represent allocated space. |
| static const char kNameObjectCount[]; // To represent number of objects. |
| |
| // Standard attribute |unit|s for the AddScalar and AddString() methods. |
| static const char kUnitsBytes[]; // Unit name to represent bytes. |
| static const char kUnitsObjects[]; // Unit name to represent #objects. |
| |
| // Constants used only internally and by tests. |
| static const char kTypeScalar[]; // Type name for scalar attributes. |
| static const char kTypeString[]; // Type name for string attributes. |
| |
| // Setters for scalar attributes. Some examples: |
| // - "size" column (all dumps are expected to have at least this one): |
| // AddScalar(kNameSize, kUnitsBytes, 1234); |
| // - Some extra-column reporting internal details of the subsystem: |
| // AddScalar("number_of_freelist_entries", kUnitsObjects, 42) |
| // - Other informational column: |
| // AddString("kitten", "name", "shadow"); |
| void AddScalar(const char* name, const char* units, uint64_t value); |
| void AddString(const char* name, const char* units, const std::string& value); |
| |
| // Absolute name, unique within the scope of an entire ProcessMemoryDump. |
| const std::string& absolute_name() const { return absolute_name_; } |
| |
| // Called at trace generation time to populate the TracedValue. |
| void AsValueInto(TracedValue* value) const; |
| |
| // Get the size for this dump. |
| // The size is the value set with AddScalar(kNameSize, kUnitsBytes, size); |
| // TODO(hjd): this should return an Optional<uint64_t>. |
| uint64_t GetSizeInternal() const; |
| |
| MemoryDumpLevelOfDetail level_of_detail() const { return level_of_detail_; } |
| |
| // Use enum Flags to set values. |
| void set_flags(int flags) { flags_ |= flags; } |
| void clear_flags(int flags) { flags_ &= ~flags; } |
| int flags() const { return flags_; } |
| |
| // |guid| is an optional global dump identifier, unique across all processes |
| // within the scope of a global dump. It is only required when using the |
| // graph APIs (see TODO_method_name) to express retention / suballocation or |
| // cross process sharing. See crbug.com/492102 for design docs. |
| // Subsequent MemoryAllocatorDump(s) with the same |absolute_name| are |
| // expected to have the same guid. |
| const MemoryAllocatorDumpGuid& guid() const { return guid_; } |
| |
| const std::vector<Entry>& entries() const { return entries_; } |
| |
| // Only for mojo serialization, which can mutate the collection. |
| std::vector<Entry>* mutable_entries_for_serialization() const { |
| cached_size_.reset(); // The caller can mutate the collection. |
| |
| // Mojo takes a const input argument even for move-only types that can be |
| // mutate while serializing (like this one). Hence the const_cast. |
| return const_cast<std::vector<Entry>*>(&entries_); |
| } |
| |
| private: |
| const std::string absolute_name_; |
| MemoryAllocatorDumpGuid guid_; |
| MemoryDumpLevelOfDetail level_of_detail_; |
| int flags_; // See enum Flags. |
| mutable Optional<uint64_t> cached_size_; // Lazy, for GetSizeInternal(). |
| std::vector<Entry> entries_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MemoryAllocatorDump); |
| }; |
| |
| // This is required by gtest to print a readable output on test failures. |
| void BASE_EXPORT PrintTo(const MemoryAllocatorDump::Entry&, std::ostream*); |
| |
| } // namespace trace_event |
| } // namespace base |
| |
| #endif // BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_ |