summaryrefslogtreecommitdiffstats
path: root/third_party/tcmalloc
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 12:01:10 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 12:01:10 +0000
commit70f02ffc235e311a494fb4f6c15c3027fc917bb5 (patch)
tree6bb8b34ff535a70b5117a24feb403ae9d146f8ae /third_party/tcmalloc
parent02a7c27975b17d4098d8972e6082180a177e4736 (diff)
downloadchromium_src-70f02ffc235e311a494fb4f6c15c3027fc917bb5.zip
chromium_src-70f02ffc235e311a494fb4f6c15c3027fc917bb5.tar.gz
chromium_src-70f02ffc235e311a494fb4f6c15c3027fc917bb5.tar.bz2
Fix mmap region iteration while no regions are recorded.
If no mmap regions are recorded, iteration failed since the RegionSet (std::set) object is not initialized. BUG=162208 R=willchan@chromium.org Review URL: https://codereview.chromium.org/14769008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198878 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/tcmalloc')
-rw-r--r--third_party/tcmalloc/chromium/src/deep-heap-profile.cc7
-rw-r--r--third_party/tcmalloc/chromium/src/memory_region_map.cc21
-rw-r--r--third_party/tcmalloc/chromium/src/memory_region_map.h3
3 files changed, 21 insertions, 10 deletions
diff --git a/third_party/tcmalloc/chromium/src/deep-heap-profile.cc b/third_party/tcmalloc/chromium/src/deep-heap-profile.cc
index 566dde1..7201c8f 100644
--- a/third_party/tcmalloc/chromium/src/deep-heap-profile.cc
+++ b/third_party/tcmalloc/chromium/src/deep-heap-profile.cc
@@ -646,8 +646,11 @@ void DeepHeapProfile::GlobalStats::SnapshotMaps(
MemoryRegionMap::RegionIterator mmap_iter =
MemoryRegionMap::BeginRegionLocked();
- DeepBucket* deep_bucket = GetInformationOfMemoryRegion(
- mmap_iter, memory_residence_info_getter, deep_profile);
+ DeepBucket* deep_bucket = NULL;
+ if (mmap_iter != MemoryRegionMap::EndRegionLocked()) {
+ deep_bucket = GetInformationOfMemoryRegion(
+ mmap_iter, memory_residence_info_getter, deep_profile);
+ }
while (procmaps_iter.Next(&vma_start_addr, &vma_last_addr,
&flags, &offset, &inode, &filename)) {
diff --git a/third_party/tcmalloc/chromium/src/memory_region_map.cc b/third_party/tcmalloc/chromium/src/memory_region_map.cc
index dcc73c4..a94c964 100644
--- a/third_party/tcmalloc/chromium/src/memory_region_map.cc
+++ b/third_party/tcmalloc/chromium/src/memory_region_map.cc
@@ -231,6 +231,8 @@ void MemoryRegionMap::Init(int max_stack_depth, bool use_buckets) {
memset(bucket_table_, 0, table_bytes);
num_buckets_ = 0;
}
+ if (regions_ == NULL) // init regions_
+ InitRegionSetLocked();
Unlock();
RAW_VLOG(10, "MemoryRegionMap Init done");
}
@@ -533,6 +535,15 @@ void MemoryRegionMap::RestoreSavedBucketsLocked() {
}
}
+inline void MemoryRegionMap::InitRegionSetLocked() {
+ RAW_VLOG(12, "Initializing region set");
+ regions_ = regions_rep.region_set();
+ recursive_insert = true;
+ new(regions_) RegionSet();
+ HandleSavedRegionsLocked(&DoInsertRegionLocked);
+ recursive_insert = false;
+}
+
inline void MemoryRegionMap::InsertRegionLocked(const Region& region) {
RAW_CHECK(LockIsHeld(), "should be held (by this thread)");
// We can be called recursively, because RegionSet constructor
@@ -552,14 +563,8 @@ inline void MemoryRegionMap::InsertRegionLocked(const Region& region) {
// then increment saved_regions_count.
saved_regions[saved_regions_count++] = region;
} else { // not a recusrive call
- if (regions_ == NULL) { // init regions_
- RAW_VLOG(12, "Initializing region set");
- regions_ = regions_rep.region_set();
- recursive_insert = true;
- new(regions_) RegionSet();
- HandleSavedRegionsLocked(&DoInsertRegionLocked);
- recursive_insert = false;
- }
+ if (regions_ == NULL) // init regions_
+ InitRegionSetLocked();
recursive_insert = true;
// Do the actual insertion work to put new regions into regions_:
DoInsertRegionLocked(region);
diff --git a/third_party/tcmalloc/chromium/src/memory_region_map.h b/third_party/tcmalloc/chromium/src/memory_region_map.h
index be191a9..7187680 100644
--- a/third_party/tcmalloc/chromium/src/memory_region_map.h
+++ b/third_party/tcmalloc/chromium/src/memory_region_map.h
@@ -361,6 +361,9 @@ class MemoryRegionMap {
// table where all buckets eventually should be.
static void RestoreSavedBucketsLocked();
+ // Initialize RegionSet regions_.
+ inline static void InitRegionSetLocked();
+
// Wrapper around DoInsertRegionLocked
// that handles the case of recursive allocator calls.
inline static void InsertRegionLocked(const Region& region);