Ticket #8395: lockfree2.patch

File lockfree2.patch, 1.5 KB (added by adam@…, 10 years ago)

Revised patch that uses a custom allocator to zero initialise nodes.

  • queue.hpp

    old new  
    117117    };
    118118
    119119    typedef typename detail::extract_allocator<bound_args, node>::type node_allocator;
    120     typedef typename detail::select_freelist<node, node_allocator, compile_time_sized, fixed_sized, capacity>::type pool_t;
     120   
     121    struct initialised_node_allocator : node_allocator
     122    {
     123        initialised_node_allocator()
     124        {
     125        }
     126
     127        initialised_node_allocator( const node_allocator& a ) :
     128            node_allocator(a)
     129        {
     130        }
     131
     132        typename node_allocator::pointer allocate(
     133            typename node_allocator::size_type n,
     134            typename node_allocator::const_pointer hint=0 )
     135        {
     136            typename node_allocator::pointer p = node_allocator::allocate(n,hint);
     137            memset(p,0,sizeof(*p)*n);
     138            return p;
     139        }
     140    };
     141
     142    typedef typename detail::select_freelist<node, initialised_node_allocator, compile_time_sized, fixed_sized, capacity>::type pool_t;
    121143    typedef typename pool_t::tagged_node_handle tagged_node_handle;
    122144    typedef typename detail::select_tagged_handle<node, node_based>::handle_type handle_type;
    123145
     
    191213    explicit queue(size_type n):
    192214        head_(tagged_node_handle(0, 0)),
    193215        tail_(tagged_node_handle(0, 0)),
    194         pool(node_allocator(), n + 1)
     216        pool(initialised_node_allocator(), n + 1)
    195217    {
    196218        BOOST_ASSERT(!has_capacity);
    197219        initialize();