1 //===-- scudo_allocator_combined.h ------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// Scudo Combined Allocator, dispatches allocation & deallocation requests to 11 /// the Primary or the Secondary backend allocators. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef SCUDO_ALLOCATOR_COMBINED_H_ 16 #define SCUDO_ALLOCATOR_COMBINED_H_ 17 18 #ifndef SCUDO_ALLOCATOR_H_ 19 # error "This file must be included inside scudo_allocator.h." 20 #endif 21 22 template <class PrimaryAllocator, class AllocatorCache, 23 class SecondaryAllocator> 24 class CombinedAllocator { 25 public: init(s32 ReleaseToOSIntervalMs)26 void init(s32 ReleaseToOSIntervalMs) { 27 Primary.Init(ReleaseToOSIntervalMs); 28 Secondary.Init(); 29 Stats.Init(); 30 } 31 32 // Primary allocations are always MinAlignment aligned, and as such do not 33 // require an Alignment parameter. allocatePrimary(AllocatorCache * Cache,uptr ClassId)34 void *allocatePrimary(AllocatorCache *Cache, uptr ClassId) { 35 return Cache->Allocate(&Primary, ClassId); 36 } 37 38 // Secondary allocations do not require a Cache, but do require an Alignment 39 // parameter. allocateSecondary(uptr Size,uptr Alignment)40 void *allocateSecondary(uptr Size, uptr Alignment) { 41 return Secondary.Allocate(&Stats, Size, Alignment); 42 } 43 deallocatePrimary(AllocatorCache * Cache,void * Ptr,uptr ClassId)44 void deallocatePrimary(AllocatorCache *Cache, void *Ptr, uptr ClassId) { 45 Cache->Deallocate(&Primary, ClassId, Ptr); 46 } 47 deallocateSecondary(void * Ptr)48 void deallocateSecondary(void *Ptr) { 49 Secondary.Deallocate(&Stats, Ptr); 50 } 51 initCache(AllocatorCache * Cache)52 void initCache(AllocatorCache *Cache) { 53 Cache->Init(&Stats); 54 } 55 destroyCache(AllocatorCache * Cache)56 void destroyCache(AllocatorCache *Cache) { 57 Cache->Destroy(&Primary, &Stats); 58 } 59 getStats(AllocatorStatCounters StatType)60 void getStats(AllocatorStatCounters StatType) const { 61 Stats.Get(StatType); 62 } 63 printStats()64 void printStats() { 65 Primary.PrintStats(); 66 Secondary.PrintStats(); 67 } 68 69 private: 70 PrimaryAllocator Primary; 71 SecondaryAllocator Secondary; 72 AllocatorGlobalStats Stats; 73 }; 74 75 #endif // SCUDO_ALLOCATOR_COMBINED_H_ 76