diff --git a/compiler-rt/lib/scudo/standalone/local_cache.h b/compiler-rt/lib/scudo/standalone/local_cache.h index 1814272277ff4..6898840eb2bcb 100644 --- a/compiler-rt/lib/scudo/standalone/local_cache.h +++ b/compiler-rt/lib/scudo/standalone/local_cache.h @@ -40,7 +40,11 @@ template struct SizeClassAllocatorLocalCache { DCHECK_LT(ClassId, NumClasses); PerClass *C = &PerClassArray[ClassId]; if (C->Count == 0) { - if (UNLIKELY(!refill(C, ClassId))) + initCacheMaybe(C); + + // Refill half of the number of max cached. + DCHECK_GT(C->MaxCount / 2, 0U); + if (UNLIKELY(!refill(C, ClassId, C->MaxCount / 2))) return nullptr; DCHECK_GT(C->Count, 0); } @@ -173,14 +177,10 @@ template struct SizeClassAllocatorLocalCache { deallocate(BatchClassId, B); } - NOINLINE bool refill(PerClass *C, uptr ClassId) { - initCacheMaybe(C); - - // TODO(chiahungduan): Pass the max number cached for each size class. + NOINLINE bool refill(PerClass *C, uptr ClassId, u16 MaxRefill) { const u16 NumBlocksRefilled = - Allocator->popBlocks(this, ClassId, C->Chunks); - DCHECK_LE(NumBlocksRefilled, - getMaxCached(SizeClassAllocator::getSizeByClassId(ClassId))); + Allocator->popBlocks(this, ClassId, C->Chunks, MaxRefill); + DCHECK_LE(NumBlocksRefilled, MaxRefill); C->Count = static_cast(C->Count + NumBlocksRefilled); return NumBlocksRefilled != 0; } diff --git a/compiler-rt/lib/scudo/standalone/primary32.h b/compiler-rt/lib/scudo/standalone/primary32.h index c900550ac675e..8281e02ba164c 100644 --- a/compiler-rt/lib/scudo/standalone/primary32.h +++ b/compiler-rt/lib/scudo/standalone/primary32.h @@ -191,7 +191,11 @@ template class SizeClassAllocator32 { return BlockSize > PageSize; } - u16 popBlocks(CacheT *C, uptr ClassId, CompactPtrT *ToArray) { + // Note that the `MaxBlockCount` will be used when we support arbitrary blocks + // count. Now it's the same as the number of blocks stored in the + // `TransferBatch`. + u16 popBlocks(CacheT *C, uptr ClassId, CompactPtrT *ToArray, + UNUSED const u16 MaxBlockCount) { TransferBatchT *B = popBatch(C, ClassId); if (!B) return 0; diff --git a/compiler-rt/lib/scudo/standalone/primary64.h b/compiler-rt/lib/scudo/standalone/primary64.h index 0f4ba88ee1f4b..d1929ff7212f4 100644 --- a/compiler-rt/lib/scudo/standalone/primary64.h +++ b/compiler-rt/lib/scudo/standalone/primary64.h @@ -221,7 +221,11 @@ template class SizeClassAllocator64 { DCHECK_EQ(BlocksInUse, BatchClassUsedInFreeLists); } - u16 popBlocks(CacheT *C, uptr ClassId, CompactPtrT *ToArray) { + // Note that the `MaxBlockCount` will be used when we support arbitrary blocks + // count. Now it's the same as the number of blocks stored in the + // `TransferBatch`. + u16 popBlocks(CacheT *C, uptr ClassId, CompactPtrT *ToArray, + UNUSED const u16 MaxBlockCount) { TransferBatchT *B = popBatch(C, ClassId); if (!B) return 0;