OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 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 // --- | |
6 // Author: Sainbayar Sukhbaatar | |
7 // Dai Mikurube | |
8 // | |
9 // This file contains a class DeepHeapProfile and its public function | |
10 // DeepHeapProfile::FillOrderedProfile() which works as an alternative of | |
11 // HeapProfileTable::FillOrderedProfile(). | |
12 // | |
13 // DeepHeapProfile::FillOrderedProfile() dumps more detailed information about | |
14 // heap usage, which includes OS-level information such as whether the memory | |
15 // block is actually on memory, or not. DeepHeapProfile::FillOrderedProfile() | |
jar (doing other things)
2011/12/28 08:30:17
nit: "on memory" --> "in memory" (??)
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Done.
| |
16 // uses logged data in HeapProfileTable as one of its data source. | |
jar (doing other things)
2011/12/28 08:30:17
nit: "...one of its data source" --> "...one of it
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Done.
| |
17 // DeepHeapProfile works only when its FillOrderedProfile() is called. It has | |
18 // overhead when dumping, but no overhead when logging. | |
19 // | |
20 // It currently works only on Linux. It just delegates to HeapProfileTable in | |
21 // non-Linux environments. | |
22 | |
23 | |
24 #ifndef BASE_DEEP_HEAP_PROFILE_H_ | |
25 #define BASE_DEEP_HEAP_PROFILE_H_ | |
26 | |
27 #include "config.h" | |
28 | |
29 #if defined(__linux__) | |
30 #define DEEP_HEAP_PROFILE 1 | |
31 #endif | |
32 | |
33 #include "addressmap-inl.h" | |
34 #include "heap-profile-table.h" | |
35 | |
36 class DeepHeapProfile { | |
37 public: | |
38 typedef HeapProfileTable::Bucket Bucket; | |
39 typedef HeapProfileTable::AllocationMap AllocationMap; | |
40 typedef HeapProfileTable::AllocValue AllocValue; | |
41 typedef HeapProfileTable::Stats Stats; | |
42 | |
43 DeepHeapProfile(HeapProfileTable* heap_profile, const char* prefix); | |
jar (doing other things)
2011/12/28 08:30:17
Please add comments indicating what the function d
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Done.
| |
44 ~DeepHeapProfile(); | |
45 | |
46 // This replaces the same function in heap-profile-table.h | |
jar (doing other things)
2011/12/28 08:30:17
That is a fine secondary comment... but it is bett
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Done.
| |
47 int FillOrderedProfile(char buf[], int size); | |
48 | |
49 private: | |
50 #ifdef DEEP_HEAP_PROFILE | |
51 struct DeepBucket { | |
52 Bucket* bucket; | |
53 size_t committed_size; | |
54 int id; // Unique ID of the bucket | |
jar (doing other things)
2011/12/28 08:30:17
nit: Comments should end with a period.
Please co
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Done.
| |
55 bool is_logged; // True if the stracktrace is logged to a file | |
56 }; | |
57 | |
58 typedef AddressMap<DeepBucket> DeepBucketMap; | |
59 | |
60 struct PageState { | |
61 bool is_committed; // Currently, we use only this | |
62 bool is_present; | |
63 bool is_swapped; | |
64 bool is_shared; | |
65 bool is_mmap; | |
66 }; | |
67 | |
68 struct RegionStats { | |
69 size_t virtual_bytes; | |
70 size_t committed_bytes; | |
71 }; | |
72 | |
73 struct GlobalStats { | |
74 RegionStats total; | |
75 RegionStats file_mapped; | |
76 RegionStats anonymous; | |
77 RegionStats other; | |
78 RegionStats record_mmap; | |
79 RegionStats record_tcmalloc; | |
80 }; | |
81 | |
82 struct BufferArgs { | |
83 char* buf; | |
84 int size; | |
85 int len; | |
86 }; | |
87 | |
88 DeepBucket* GetDeepBucket(Bucket* bucket); | |
jar (doing other things)
2011/12/28 08:30:17
nit: All these functions should have comments.
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Done.
| |
89 void ResetCommittedSize(Bucket** table); | |
90 int FillBucketTable(Bucket** table, char buf[], int size, int bucket_length, | |
91 HeapProfileTable::Stats* stats); | |
92 | |
93 // Functions for opening, seeking, reading /proc/pid/pagemap | |
94 void OpenProcPagemap(); | |
95 bool SeekProcPagemap(uint64 addr); | |
96 bool ReadProcPagemap(PageState* state); | |
97 size_t GetCommittedSize(uint64 addr, size_t size); | |
98 | |
99 void InitRegionStats(RegionStats* stats); | |
100 void RecordRegionStats(uint64 start, uint64 end, RegionStats* stats); | |
101 void GetGlobalStats(); | |
102 | |
103 // Record the committed memory size of each allocations | |
104 static void RecordAlloc(const void* ptr, AllocValue* v, | |
105 DeepHeapProfile* deep_profile); | |
106 static void RecordMMap(const void* ptr, AllocValue* v, | |
107 DeepHeapProfile* deep_profile); | |
108 void RecordAllAllocs(); | |
109 | |
110 void WriteMapsToFile(char buf[], int size); | |
111 | |
112 int FillBucketForBucketFile(const DeepBucket* db, char buf[], int bufsize); | |
113 void WriteBucketsTableToBucketFile(Bucket** table, RawFD bucket_fd); | |
114 void WriteBucketsToBucketFile(); | |
115 | |
116 static int UnparseBucket(const DeepBucket& b, | |
117 char* buf, int buflen, int bufsize, | |
118 const char* extra, | |
119 Stats* profile_stats); | |
120 | |
121 static int UnparseRegionStats(const RegionStats* stats, const char* name, | |
122 char* buf, int buflen, int bufsize); | |
123 | |
124 int UnparseGlobalStats(char* buf, int buflen, int bufsize); | |
125 | |
126 #endif // DEEP_HEAP_PROFILE | |
127 HeapProfileTable* heap_profile_; | |
jar (doing other things)
2011/12/28 08:30:17
Why isn't this line inside the ifdef?
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
It is used to delegate calling of FillOrderedProfi
jar (doing other things)
2012/01/06 03:05:10
nit: OK... so if you don't want it in the ifdef, h
Dai Mikurube (NOT FULLTIME)
2012/01/30 12:54:53
Sorry, I overlooked this comment. Done it.
On 20
| |
128 #ifdef DEEP_HEAP_PROFILE | |
129 | |
130 int pagemap_fd_; // File descriptor of /proc/self/pagemap | |
131 pid_t most_recent_pid_; // Process ID of the last dump. This could change. | |
132 GlobalStats stats_; // Stats about total memory | |
133 int dump_count_; // The number of dumps | |
134 char* filename_prefix_; // Output file prefix | |
135 char* profiler_buffer_; // Buffer we use many times | |
136 | |
137 int bucket_id_; | |
138 DeepBucketMap* deep_bucket_map_; | |
139 #endif // DEEP_HEAP_PROFILE | |
140 }; | |
jar (doing other things)
2011/12/28 08:30:17
Why doesn't this class have the unsafe copy and co
Dai Mikurube (NOT FULLTIME)
2012/01/06 01:25:23
Ah, I forgot or deleted it wrongly before. Added.
| |
141 | |
142 #endif // BASE_DEEP_HEAP_PROFILE_H_ | |
OLD | NEW |