• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 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 
5 #ifndef BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
6 #define BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
7 
8 #include <stdint.h>
9 
10 #include <memory>
11 #include <string>
12 
13 #include "base/base_export.h"
14 #include "base/logging.h"
15 #include "base/macros.h"
16 #include "base/trace_event/memory_allocator_dump_guid.h"
17 #include "base/values.h"
18 
19 namespace base {
20 namespace trace_event {
21 
22 class MemoryDumpManager;
23 class ProcessMemoryDump;
24 class TracedValue;
25 
26 // Data model for user-land memory allocator dumps.
27 class BASE_EXPORT MemoryAllocatorDump {
28  public:
29   enum Flags {
30     DEFAULT = 0,
31 
32     // A dump marked weak will be discarded by TraceViewer.
33     WEAK = 1 << 0,
34   };
35 
36   // MemoryAllocatorDump is owned by ProcessMemoryDump.
37   MemoryAllocatorDump(const std::string& absolute_name,
38                       ProcessMemoryDump* process_memory_dump,
39                       const MemoryAllocatorDumpGuid& guid);
40   MemoryAllocatorDump(const std::string& absolute_name,
41                       ProcessMemoryDump* process_memory_dump);
42   ~MemoryAllocatorDump();
43 
44   // Standard attribute |name|s for the AddScalar and AddString() methods.
45   static const char kNameSize[];          // To represent allocated space.
46   static const char kNameObjectCount[];   // To represent number of objects.
47 
48   // Standard attribute |unit|s for the AddScalar and AddString() methods.
49   static const char kUnitsBytes[];    // Unit name to represent bytes.
50   static const char kUnitsObjects[];  // Unit name to represent #objects.
51 
52   // Constants used only internally and by tests.
53   static const char kTypeScalar[];  // Type name for scalar attributes.
54   static const char kTypeString[];  // Type name for string attributes.
55 
56   // Setters for scalar attributes. Some examples:
57   // - "size" column (all dumps are expected to have at least this one):
58   //     AddScalar(kNameSize, kUnitsBytes, 1234);
59   // - Some extra-column reporting internal details of the subsystem:
60   //    AddScalar("number_of_freelist_entires", kUnitsObjects, 42)
61   // - Other informational column (will not be auto-added in the UI)
62   //    AddScalarF("kittens_ratio", "ratio", 42.0f)
63   void AddScalar(const char* name, const char* units, uint64_t value);
64   void AddScalarF(const char* name, const char* units, double value);
65   void AddString(const char* name, const char* units, const std::string& value);
66 
67   // Absolute name, unique within the scope of an entire ProcessMemoryDump.
absolute_name()68   const std::string& absolute_name() const { return absolute_name_; }
69 
70   // Called at trace generation time to populate the TracedValue.
71   void AsValueInto(TracedValue* value) const;
72 
73   // Get the ProcessMemoryDump instance that owns this.
process_memory_dump()74   ProcessMemoryDump* process_memory_dump() const {
75     return process_memory_dump_;
76   }
77 
78   // Use enum Flags to set values.
set_flags(int flags)79   void set_flags(int flags) { flags_ |= flags; }
clear_flags(int flags)80   void clear_flags(int flags) { flags_ &= ~flags; }
flags()81   int flags() { return flags_; }
82 
83   // |guid| is an optional global dump identifier, unique across all processes
84   // within the scope of a global dump. It is only required when using the
85   // graph APIs (see TODO_method_name) to express retention / suballocation or
86   // cross process sharing. See crbug.com/492102 for design docs.
87   // Subsequent MemoryAllocatorDump(s) with the same |absolute_name| are
88   // expected to have the same guid.
guid()89   const MemoryAllocatorDumpGuid& guid() const { return guid_; }
90 
attributes_for_testing()91   TracedValue* attributes_for_testing() const { return attributes_.get(); }
92 
93  private:
94   const std::string absolute_name_;
95   ProcessMemoryDump* const process_memory_dump_;  // Not owned (PMD owns this).
96   std::unique_ptr<TracedValue> attributes_;
97   MemoryAllocatorDumpGuid guid_;
98   int flags_;  // See enum Flags.
99 
100   // A local buffer for Sprintf conversion on fastpath. Avoids allocating
101   // temporary strings on each AddScalar() call.
102   std::string string_conversion_buffer_;
103 
104   DISALLOW_COPY_AND_ASSIGN(MemoryAllocatorDump);
105 };
106 
107 }  // namespace trace_event
108 }  // namespace base
109 
110 #endif  // BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
111