static void deallocate_many(multiallocation_chain &chain) { std::size_t size = chain.size(); std::pair<void*, void*> ptrs = chain.extract_data(); boost_cont_memchain dlchain; BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&dlchain, ptrs.first, ptrs.second, size); boost_cont_multidealloc(&dlchain); }
static void deallocate_individual(Allocator &a, multiallocation_chain &holder) { size_type n = holder.size(); typename multiallocation_chain::iterator it = holder.begin(); while(n--){ pointer p = boost::intrusive::pointer_traits<pointer>::pointer_to(*it); ++it; a.deallocate(p, 1); } }
void deallocate_nodes(multiallocation_chain chain) { typedef typename multiallocation_chain::iterator iterator; iterator it(chain.begin()), itend(chain.end()); while(it != itend){ void *pElem = &*it; ++it; priv_dealloc_node(pElem); } }
static void allocate_individual(Allocator &a, size_type n, multiallocation_chain &m) { allocate_individual_rollback rollback(a, m); while(n--){ m.push_front(a.allocate(1)); } rollback.release(); }
void cached_allocation(size_type n, multiallocation_chain &chain) { size_type count = n, allocated(0); BOOST_TRY{ //If don't have any cached node, we have to get a new list of free nodes from the pool while(!m_cached_nodes.empty() && count--){ void *ret = ipcdetail::to_raw_pointer(m_cached_nodes.pop_front()); chain.push_back(ret); ++allocated; } if(allocated != n){ mp_node_pool->allocate_nodes(n - allocated, chain); } } BOOST_CATCH(...){ this->cached_deallocation(chain); BOOST_RETHROW }