//===-- memprof_mibmap.cpp -----------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of MemProfiler, a memory profiler. // //===----------------------------------------------------------------------===// #include "memprof_mibmap.h" #include "profile/MemProfData.inc" #include "sanitizer_common/sanitizer_allocator_internal.h" #include "sanitizer_common/sanitizer_mutex.h" namespace __memprof { using ::llvm::memprof::MemInfoBlock; void InsertOrMerge(const uptr Id, const MemInfoBlock &Block, MIBMapTy &Map) { MIBMapTy::Handle h(&Map, static_cast(Id), /*remove=*/false, /*create=*/true); if (h.created()) { LockedMemInfoBlock *lmib = (LockedMemInfoBlock *)InternalAlloc(sizeof(LockedMemInfoBlock)); lmib->mutex.Init(); lmib->mib = Block; *h = lmib; } 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); } } } // namespace __memprof