@ -40,11 +40,11 @@ BuddyAllocator::~BuddyAllocator() {
" have actually been freed " ;
while ( ! pool_ . empty ( ) ) {
auto block = static_cast < MemoryBlock * > ( std : : get < 2 > ( * pool_ . begin ( ) ) ) ;
VLOG ( 10 ) < < " Free from block ( " < < block < < " , " < < block - > size ( cache_ )
< < " ) " ;
auto desc = cache_ . LoadDesc ( block ) ;
VLOG ( 10 ) < < " Free from block (" < < block < < " , " < < desc - > get_size ( ) < < " ) " ;
system_allocator_ - > Free ( block , block- > size ( cache_ ) , block - > index ( cache_ ) ) ;
cache_ . i nvalidate( block ) ;
system_allocator_ - > Free ( block , desc- > get_size ( ) , desc - > get_index ( ) ) ;
cache_ . I nvalidate( block ) ;
pool_ . erase ( pool_ . begin ( ) ) ;
}
}
@ -84,82 +84,83 @@ void* BuddyAllocator::Alloc(size_t unaligned_size) {
} else {
VLOG ( 10 ) < < " Allocation from existing memory block " < < std : : get < 2 > ( * it )
< < " at address "
< < reinterpret_cast < MemoryBlock * > ( std : : get < 2 > ( * it ) ) - > d ata( ) ;
< < reinterpret_cast < MemoryBlock * > ( std : : get < 2 > ( * it ) ) - > D ata( ) ;
}
total_used_ + = size ;
total_free_ - = size ;
// split the allocation and return data for use
return reinterpret_cast < MemoryBlock * > ( SplitToAlloc ( it , size ) ) - > d ata( ) ;
return reinterpret_cast < MemoryBlock * > ( SplitToAlloc ( it , size ) ) - > D ata( ) ;
}
void BuddyAllocator : : Free ( void * p ) {
// Point back to metadata
auto block = static_cast < MemoryBlock * > ( p ) - > m etadata( ) ;
auto block = static_cast < MemoryBlock * > ( p ) - > M etadata( ) ;
// Acquire the allocator lock
std : : lock_guard < std : : mutex > lock ( mutex_ ) ;
VLOG ( 10 ) < < " Free from address " < < block ;
if ( block - > type ( cache_ ) = = MemoryBlock : : HUGE_CHUNK ) {
auto * desc = cache_ . LoadDesc ( block ) ;
if ( desc - > get_type ( ) = = MemoryBlock : : HUGE_CHUNK ) {
VLOG ( 10 ) < < " Free directly from system allocator " ;
system_allocator_ - > Free ( block , block - > total_size ( cache_ ) ,
block - > index ( cache_ ) ) ;
system_allocator_ - > Free ( block , desc - > get_total_size ( ) , desc - > get_index ( ) ) ;
// Invalidate GPU allocation from cache
cache_ . i nvalidate( block ) ;
cache_ . I nvalidate( block ) ;
return ;
}
block - > mark_as_f ree( & cache_ ) ;
block - > MarkAsF ree( & cache_ ) ;
total_used_ - = block- > total_size ( cache_ ) ;
total_free_ + = block- > total_size ( cache_ ) ;
total_used_ - = desc- > get_total_size ( ) ;
total_free_ + = desc- > get_total_size ( ) ;
// Trying to merge the right buddy
if ( block - > has_right_buddy ( cache_ ) ) {
MemoryBlock * right_buddy = block - > GetRightBuddy ( & cache_ ) ;
if ( right_buddy ) {
VLOG ( 10 ) < < " Merging this block " < < block < < " with its right buddy "
< < block- > right_buddy( cache_ ) ;
< < right_buddy;
auto right_buddy = block - > right_buddy ( cache_ ) ;
if ( right_buddy - > type ( cache_ ) = = MemoryBlock : : FREE_CHUNK ) {
auto rb_desc = cache_ . LoadDesc ( right_buddy ) ;
if ( rb_desc - > get_type ( ) = = MemoryBlock : : FREE_CHUNK ) {
// Take away right buddy from pool
pool_ . erase ( IndexSizeAddress ( right_buddy - > index ( cache_ ) ,
right_buddy - > total_size ( cache_ ) ,
right_buddy ) ) ;
pool_ . erase ( IndexSizeAddress ( rb_desc - > get_index ( ) ,
rb_desc - > get_total_size ( ) , right_buddy ) ) ;
// merge its right buddy to the block
block - > m erge( & cache_ , right_buddy ) ;
block - > M erge( & cache_ , right_buddy ) ;
}
}
// Trying to merge the left buddy
if ( block - > has_left_buddy ( cache_ ) ) {
MemoryBlock * left_buddy = block - > GetLeftBuddy ( & cache_ ) ;
if ( left_buddy ) {
VLOG ( 10 ) < < " Merging this block " < < block < < " with its left buddy "
< < block - > left_buddy ( cache_ ) ;
auto left_buddy = block - > left_buddy ( cache_ ) ;
< < left_buddy ;
if ( left_buddy - > type ( cache_ ) = = MemoryBlock : : FREE_CHUNK ) {
// auto left_buddy = block->left_buddy(cache_);
auto * lb_desc = cache_ . LoadDesc ( left_buddy ) ;
if ( lb_desc - > get_type ( ) = = MemoryBlock : : FREE_CHUNK ) {
// Take away right buddy from pool
pool_ . erase ( IndexSizeAddress ( left_buddy - > index ( cache_ ) ,
l eft_buddy- > total_size ( cache_ ) , left_buddy ) ) ;
pool_ . erase ( IndexSizeAddress ( l b_desc- > get_index ( ) ,
l b_desc- > get_total_size ( ) , left_buddy ) ) ;
// merge the block to its left buddy
left_buddy - > m erge( & cache_ , block ) ;
left_buddy - > M erge( & cache_ , block ) ;
block = left_buddy ;
desc = lb_desc ;
}
}
// Dumping this block into pool
VLOG ( 10 ) < < " Inserting free block ( " < < block < < " , "
< < block- > total_size ( cache_ ) < < " ) " ;
< < desc- > get_total_size ( ) < < " ) " ;
pool_ . insert (
IndexSizeAddress ( block- > index ( cache_ ) , block - > total_size ( cache_ ) , block ) ) ;
IndexSizeAddress ( desc- > get_index ( ) , desc - > get_total_size ( ) , block ) ) ;
}
size_t BuddyAllocator : : Used ( ) { return total_used_ ; }
@ -174,10 +175,10 @@ void* BuddyAllocator::SystemAlloc(size_t size) {
if ( p = = nullptr ) return nullptr ;
static_cast < MemoryBlock * > ( p ) - > i nit( & cache_ , MemoryBlock : : HUGE_CHUNK , index ,
static_cast < MemoryBlock * > ( p ) - > I nit( & cache_ , MemoryBlock : : HUGE_CHUNK , index ,
size , nullptr , nullptr ) ;
return static_cast < MemoryBlock * > ( p ) - > d ata( ) ;
return static_cast < MemoryBlock * > ( p ) - > D ata( ) ;
}
BuddyAllocator : : PoolSet : : iterator BuddyAllocator : : RefillPool (
@ -209,7 +210,7 @@ BuddyAllocator::PoolSet::iterator BuddyAllocator::RefillPool(
VLOG ( 10 ) < < " Creating and inserting new block " < < p
< < " from system allocator " ;
static_cast < MemoryBlock * > ( p ) - > i nit( & cache_ , MemoryBlock : : FREE_CHUNK , index ,
static_cast < MemoryBlock * > ( p ) - > I nit( & cache_ , MemoryBlock : : FREE_CHUNK , index ,
allocate_bytes , nullptr , nullptr ) ;
total_free_ + = allocate_bytes ;
@ -243,26 +244,26 @@ BuddyAllocator::PoolSet::iterator BuddyAllocator::FindExistChunk(size_t size) {
void * BuddyAllocator : : SplitToAlloc ( BuddyAllocator : : PoolSet : : iterator it ,
size_t size ) {
auto block = static_cast < MemoryBlock * > ( std : : get < 2 > ( * it ) ) ;
auto desc = cache_ . LoadDesc ( block ) ;
pool_ . erase ( it ) ;
VLOG ( 10 ) < < " Split block ( " < < block < < " , " < < block- > total_size ( cache_ )
VLOG ( 10 ) < < " Split block ( " < < block < < " , " < < desc- > get_total_size ( )
< < " ) into " ;
block - > s plit( & cache_ , size ) ;
block - > S plit( & cache_ , size ) ;
VLOG ( 10 ) < < " Left block ( " < < block < < " , " < < block - > total_size ( cache_ )
< < " ) " ;
block - > set_type ( & cache_ , MemoryBlock : : ARENA_CHUNK ) ;
VLOG ( 10 ) < < " Left block ( " < < block < < " , " < < desc - > get_total_size ( ) < < " ) " ;
desc - > set_type ( MemoryBlock : : ARENA_CHUNK ) ;
// the rest of memory if exist
if ( block - > has_right_buddy ( cache_ ) ) {
if ( block- > right_buddy( cache_ ) - > type ( cache_ ) = = MemoryBlock : : FREE_CHUNK ) {
VLOG ( 10 ) < < " Insert right block ( " < < block - > right_buddy ( cache_ ) < < " , "
< < block - > right_buddy ( cache_ ) - > total_size ( cache_ ) < < " ) " ;
pool_ . insert (
IndexSizeAddress ( block - > right_buddy ( cache_ ) - > index ( cache_ ) ,
block - > right_buddy ( cache_ ) - > total_size ( cache_ ) ,
block - > right_buddy ( cache_ ) ) ) ;
MemoryBlock * right_buddy = block - > GetRightBuddy ( & cache_ ) ;
if ( right_buddy) {
auto * rb_desc = cache_ . LoadDesc ( right_buddy ) ;
if ( rb_desc - > get_type ( ) = = MemoryBlock : : FREE_CHUNK ) {
VLOG ( 10 ) < < " Insert right block ( " < < right_buddy < < " , "
< < rb_desc - > get_total_size ( ) < < " ) " ;
pool_ . insert ( IndexSizeAddress ( rb_desc - > get_index ( ) ,
rb_desc - > get_total_size ( ) , right_buddy ) ) ;
}
}