Chromium Code Reviews| Index: third_party/tcmalloc/chromium/src/heap-profile-table.cc |
| diff --git a/third_party/tcmalloc/chromium/src/heap-profile-table.cc b/third_party/tcmalloc/chromium/src/heap-profile-table.cc |
| index 68ec5735026f8feced50e6612c760ced6915b809..23ba288bbed397221ce99a3c37396414a47655e6 100644 |
| --- a/third_party/tcmalloc/chromium/src/heap-profile-table.cc |
| +++ b/third_party/tcmalloc/chromium/src/heap-profile-table.cc |
| @@ -131,6 +131,7 @@ HeapProfileTable::HeapProfileTable(Allocator alloc, |
| dealloc_(dealloc), |
| bucket_table_(NULL), |
| profile_mmap_(profile_mmap), |
| + profile_self_maps_(true), |
| num_buckets_(0), |
| address_map_(NULL) { |
| // Make a hash table for buckets. |
| @@ -393,24 +394,34 @@ void HeapProfileTable::IterateOrderedAllocContexts( |
| dealloc_(list); |
| } |
| +void HeapProfileTable::DisableProfileSelfMaps() { |
| + profile_self_maps_ = false; |
| +} |
| + |
| int HeapProfileTable::FillOrderedProfile(char buf[], int size) const { |
| Bucket** list = MakeSortedBucketList(); |
| - // Our file format is "bucket, bucket, ..., bucket, proc_self_maps_info". |
| - // In the cases buf is too small, we'd rather leave out the last |
| - // buckets than leave out the /proc/self/maps info. To ensure that, |
| - // we actually print the /proc/self/maps info first, then move it to |
| - // the end of the buffer, then write the bucket info into whatever |
| - // is remaining, and then move the maps info one last time to close |
| - // any gaps. Whew! |
| - int map_length = snprintf(buf, size, "%s", kProcSelfMapsHeader); |
| - if (map_length < 0 || map_length >= size) return 0; |
| - bool dummy; // "wrote_all" -- did /proc/self/maps fit in its entirety? |
| - map_length += FillProcSelfMaps(buf + map_length, size - map_length, &dummy); |
| - RAW_DCHECK(map_length <= size, ""); |
| - char* const map_start = buf + size - map_length; // move to end |
| - memmove(map_start, buf, map_length); |
| - size -= map_length; |
| + int map_length = 0; |
| + char* map_start = NULL; |
| + // The data from /proc/self/maps is not required for pseudo-stack profiles |
| + // and increases the size of the profile dumps significantly. |
|
Dai Mikurube (NOT FULLTIME)
2013/07/01 05:47:42
Is maps so large? Is large output so serious? I
James Cook
2013/07/01 16:59:16
There's also a problem where attempting to read /p
James Cook
2013/07/01 22:37:16
The GPU process hang is due to the security sandbo
Dai Mikurube (NOT FULLTIME)
2013/07/02 01:39:06
Ah, makes sense. Sorry that I forgot it. In case o
|
| + if (profile_self_maps_) { |
| + // Our file format is "bucket, bucket, ..., bucket, proc_self_maps_info". |
| + // In the cases buf is too small, we'd rather leave out the last |
| + // buckets than leave out the /proc/self/maps info. To ensure that, |
| + // we actually print the /proc/self/maps info first, then move it to |
| + // the end of the buffer, then write the bucket info into whatever |
| + // is remaining, and then move the maps info one last time to close |
| + // any gaps. Whew! |
| + map_length = snprintf(buf, size, "%s", kProcSelfMapsHeader); |
| + if (map_length < 0 || map_length >= size) return 0; |
| + bool dummy; // "wrote_all" -- did /proc/self/maps fit in its entirety? |
| + map_length += FillProcSelfMaps(buf + map_length, size - map_length, &dummy); |
| + RAW_DCHECK(map_length <= size, ""); |
| + map_start = buf + size - map_length; // move to end |
| + memmove(map_start, buf, map_length); |
| + size -= map_length; |
| + } |
| Stats stats; |
| memset(&stats, 0, sizeof(stats)); |
| @@ -434,6 +445,9 @@ int HeapProfileTable::FillOrderedProfile(char buf[], int size) const { |
| dealloc_(list); |
| + if (!profile_self_maps_) |
| + return bucket_length; |
| + |
| RAW_DCHECK(buf + bucket_length <= map_start, ""); |
| memmove(buf + bucket_length, map_start, map_length); // close the gap |