diff options
Diffstat (limited to 'base/trace_event/memory_allocator_dump.h')
-rw-r--r-- | base/trace_event/memory_allocator_dump.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/base/trace_event/memory_allocator_dump.h b/base/trace_event/memory_allocator_dump.h new file mode 100644 index 0000000000..de38afd9e7 --- /dev/null +++ b/base/trace_event/memory_allocator_dump.h @@ -0,0 +1,153 @@ +// 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_ |