Beispiel #1
0
 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);
    }
 }
Beispiel #3
0
 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
      }