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; } }
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()); } }
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); } } }
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; } } }