Esempio n. 1
0
    void deallocate (T * n)
    {
        for(;;)
        {
            tagged_ptr old_pool (pool_);

            freelist_node * new_pool = reinterpret_cast<freelist_node*>(n);

            new_pool->next.set_ptr(old_pool.get_ptr());

            if (pool_.CAS(old_pool,new_pool))
                return;
        }
    }
Esempio n. 2
0
    T * allocate (void)
    {
        for(;;)
        {
            tagged_ptr old_pool(pool_);

            if (not old_pool)
                return detail::dummy_freelist<T, Alloc>::allocate();

            freelist_node * new_pool = old_pool->next.get_ptr();

            if (pool_.CAS(old_pool, new_pool))
                return reinterpret_cast<T*>(old_pool.get_ptr());
        }
    }
Esempio n. 3
0
    T * allocate (void)
    {
        for(;;)
        {
            tagged_ptr old_pool(pool_);

            if (!old_pool)
                return 0;       /* allocation fails */

            freelist_node * new_pool = old_pool->next.get_ptr();

            if (pool_.cas(old_pool, new_pool)) {
                void * ptr = old_pool.get_ptr();
                return reinterpret_cast<T*>(ptr);
            }
        }
    }
Esempio n. 4
0
    void deallocate (T * n)
    {
        if (free_list_size > max_size)
        {
            detail::dummy_freelist<T, Alloc>::deallocate(n);
            return;
        }

        for(;;)
        {
            tagged_ptr old_pool (pool_);

            freelist_node * new_pool = reinterpret_cast<freelist_node*>(n);

            new_pool->next.set_ptr(old_pool.get_ptr());

            if (pool_.CAS(old_pool, new_pool))
            {
                --free_list_size;
                return;
            }
        }
    }