Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 19 additions & 13 deletions include/boost/interprocess/mem_algo/rbtree_best_fit.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -651,29 +651,35 @@ bool rbtree_best_fit<MutexFamily, VoidPointer, MemAlignment>::
//-----------------------
boost::interprocess::scoped_lock<mutex_type> guard(m_header);
//-----------------------
imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end());

size_type free_memory = 0;

//Iterate through all blocks obtaining their size
for(; ib != ie; ++ib){
free_memory += (size_type)ib->m_size*Alignment;
if(!algo_impl_t::check_alignment(&*ib))
return false;
}

//Check allocated bytes are less than size
if(m_header.m_allocated > m_header.m_size){
return false;
}

//Calculate the maximum free memory available in the segment
size_type block1_off =
priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes);
size_type max_free_memory = m_header.m_size - block1_off;

//Check free bytes are less than size
if(free_memory > (m_header.m_size - block1_off)){
return false;
//Iterate through all blocks obtaining their size
imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end());
size_type free_memory = 0;
for(; ib != ie; ++ib){
if(!algo_impl_t::check_alignment(&*ib)){
return false;
}
//A size of 0 is not allowed in the multiset
if(!ib->m_size){
return false;
}
free_memory += (size_type)ib->m_size*Alignment;
//Check free bytes are less than size
if(free_memory > max_free_memory){
return false;
}
}

return true;
}

Expand Down