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 <string>
11 
12 #include "base/base_export.h"
13 #include "base/logging.h"
14 #include "base/macros.h"
15 #include "base/memory/ref_counted.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   // MemoryAllocatorDump is owned by ProcessMemoryDump.
30   MemoryAllocatorDump(const std::string& absolute_name,
31                       ProcessMemoryDump* process_memory_dump,
32                       const MemoryAllocatorDumpGuid& guid);
33   MemoryAllocatorDump(const std::string& absolute_name,
34                       ProcessMemoryDump* process_memory_dump);
35   ~MemoryAllocatorDump();
36 
37   // Standard attribute |name|s for the AddScalar and AddString() methods.
38   static const char kNameSize[];          // To represent allocated space.
39   static const char kNameObjectCount[];   // To represent number of objects.
40 
41   // Standard attribute |unit|s for the AddScalar and AddString() methods.
42   static const char kUnitsBytes[];    // Unit name to represent bytes.
43   static const char kUnitsObjects[];  // Unit name to represent #objects.
44 
45   // Constants used only internally and by tests.
46   static const char kTypeScalar[];  // Type name for scalar attributes.
47   static const char kTypeString[];  // Type name for string attributes.
48 
49   // Setters for scalar attributes. Some examples:
50   // - "size" column (all dumps are expected to have at least this one):
51   //     AddScalar(kNameSize, kUnitsBytes, 1234);
52   // - Some extra-column reporting internal details of the subsystem:
53   //    AddScalar("number_of_freelist_entires", kUnitsObjects, 42)
54   // - Other informational column (will not be auto-added in the UI)
55   //    AddScalarF("kittens_ratio", "ratio", 42.0f)
56   void AddScalar(const char* name, const char* units, uint64_t value);
57   void AddScalarF(const char* name, const char* units, double value);
58   void AddString(const char* name, const char* units, const std::string& value);
59 
60   // Absolute name, unique within the scope of an entire ProcessMemoryDump.
absolute_name()61   const std::string& absolute_name() const { return absolute_name_; }
62 
63   // Called at trace generation time to populate the TracedValue.
64   void AsValueInto(TracedValue* value) const;
65 
66   // Get the ProcessMemoryDump instance that owns this.
process_memory_dump()67   ProcessMemoryDump* process_memory_dump() const {
68     return process_memory_dump_;
69   }
70 
71   // |guid| is an optional global dump identifier, unique across all processes
72   // within the scope of a global dump. It is only required when using the
73   // graph APIs (see TODO_method_name) to express retention / suballocation or
74   // cross process sharing. See crbug.com/492102 for design docs.
75   // Subsequent MemoryAllocatorDump(s) with the same |absolute_name| are
76   // expected to have the same guid.
guid()77   const MemoryAllocatorDumpGuid& guid() const { return guid_; }
78 
attributes_for_testing()79   TracedValue* attributes_for_testing() const { return attributes_.get(); }
80 
81  private:
82   const std::string absolute_name_;
83   ProcessMemoryDump* const process_memory_dump_;  // Not owned (PMD owns this).
84   scoped_refptr<TracedValue> attributes_;
85   MemoryAllocatorDumpGuid guid_;
86 
87   // A local buffer for Sprintf conversion on fastpath. Avoids allocating
88   // temporary strings on each AddScalar() call.
89   std::string string_conversion_buffer_;
90 
91   DISALLOW_COPY_AND_ASSIGN(MemoryAllocatorDump);
92 };
93 
94 }  // namespace trace_event
95 }  // namespace base
96 
97 #endif  // BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
98