summaryrefslogtreecommitdiff
path: root/compiler-rt/lib/memprof/memprof_mibmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/memprof/memprof_mibmap.cpp')
-rw-r--r--compiler-rt/lib/memprof/memprof_mibmap.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/compiler-rt/lib/memprof/memprof_mibmap.cpp b/compiler-rt/lib/memprof/memprof_mibmap.cpp
index 32f0796c8f24..a49ed8bf4fd6 100644
--- a/compiler-rt/lib/memprof/memprof_mibmap.cpp
+++ b/compiler-rt/lib/memprof/memprof_mibmap.cpp
@@ -30,7 +30,18 @@ void InsertOrMerge(const uptr Id, const MemInfoBlock &Block, MIBMapTy &Map) {
} else {
LockedMemInfoBlock *lmib = *h;
SpinMutexLock lock(&lmib->mutex);
+ uintptr_t ShorterHistogram;
+ if (Block.AccessHistogramSize > lmib->mib.AccessHistogramSize)
+ ShorterHistogram = lmib->mib.AccessHistogram;
+ else
+ ShorterHistogram = Block.AccessHistogram;
+
lmib->mib.Merge(Block);
+ // The larger histogram is kept and the shorter histogram is discarded after
+ // adding the counters to the larger historam. Free only the shorter
+ // Histogram
+ if (Block.AccessHistogramSize > 0 || lmib->mib.AccessHistogramSize > 0)
+ InternalFree((void *)ShorterHistogram);
}
}