/// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
explicit base_node( bool bInternal )
- : basic_node( bInternal ? internal : 0 )
+ : basic_node( bInternal )
, m_pNextRetired( nullptr )
{}
};
protected:
//@cond
- static void free_leaf_node( value_type * p )
+ static void free_leaf_node( value_type* p )
{
disposer()( p );
}
+ static void free_leaf_node_void( void* p )
+ {
+ free_leaf_node( reinterpret_cast<value_type*>( p ));
+ }
internal_node * alloc_internal_node() const
{
return pNode;
}
- static void free_internal_node( internal_node * pNode )
+ static void free_internal_node( internal_node* pNode )
{
cxx_node_allocator().Delete( pNode );
}
+ static void free_internal_node_void( void* pNode )
+ {
+ free_internal_node( reinterpret_cast<internal_node*>( pNode ));
+ }
struct internal_node_deleter {
void operator()( internal_node * p) const
return cxx_update_desc_allocator().New();
}
- static void free_update_desc( update_desc * pDesc )
+ static void free_update_desc( update_desc* pDesc )
{
cxx_update_desc_allocator().Delete( pDesc );
}
+ static void free_update_desc_void( void* pDesc )
+ {
+ free_update_desc( reinterpret_cast<update_desc*>( pDesc ));
+ }
class retired_list
{
cds::urcu::retired_ptr operator *()
{
if ( m_pUpdate ) {
- return cds::urcu::retired_ptr( reinterpret_cast<void *>( m_pUpdate ),
- reinterpret_cast<cds::urcu::free_retired_ptr_func>( free_update_desc ));
+ return cds::urcu::retired_ptr( reinterpret_cast<void *>( m_pUpdate ), free_update_desc_void );
}
if ( m_pNode ) {
if ( m_pNode->is_leaf()) {
return cds::urcu::retired_ptr( reinterpret_cast<void *>( node_traits::to_value_ptr( static_cast<leaf_node *>( m_pNode ))),
- reinterpret_cast< cds::urcu::free_retired_ptr_func>( free_leaf_node ));
+ free_leaf_node_void );
}
else {
return cds::urcu::retired_ptr( reinterpret_cast<void *>( static_cast<internal_node *>( m_pNode )),
- reinterpret_cast<cds::urcu::free_retired_ptr_func>( free_internal_node ));
+ free_internal_node_void );
}
}
- return cds::urcu::retired_ptr( nullptr,
- reinterpret_cast<cds::urcu::free_retired_ptr_func>( free_update_desc ));
+ return cds::urcu::retired_ptr( nullptr, free_update_desc_void );
}
void operator ++()
tree_node * pLeaf = static_cast<tree_node *>( pOp->iInfo.pLeaf );
if ( pOp->iInfo.bRightLeaf ) {
pOp->iInfo.pParent->m_pRight.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
- memory_model::memory_order_relaxed, atomics::memory_order_relaxed );
+ memory_model::memory_order_release, atomics::memory_order_relaxed );
}
else {
pOp->iInfo.pParent->m_pLeft.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
- memory_model::memory_order_relaxed, atomics::memory_order_relaxed );
+ memory_model::memory_order_release, atomics::memory_order_relaxed );
}
update_ptr cur( pOp, update_desc::IFlag );
update_ptr updGP( res.updGrandParent.ptr());
if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
- memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+ memory_model::memory_order_acq_rel, atomics::memory_order_acquire ))
{
if ( help_delete( pOp, updRetire )) {
// res.pLeaf is not deleted yet since RCU is blocked
update_ptr updGP( res.updGrandParent.ptr());
if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
- memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+ memory_model::memory_order_acq_rel, atomics::memory_order_acquire ))
{
if ( help_delete( pOp, updRetire )) {
pResult = node_traits::to_value_ptr( res.pLeaf );
update_ptr updGP( res.updGrandParent.ptr());
if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
- memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+ memory_model::memory_order_acq_rel, atomics::memory_order_acquire ))
{
if ( help_delete( pOp, updRetire )) {
pResult = node_traits::to_value_ptr( res.pLeaf );
update_ptr updGP( res.updGrandParent.ptr());
if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
- memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+ memory_model::memory_order_acq_rel, atomics::memory_order_acquire ))
{
if ( help_delete( pOp, updRetire )) {
pResult = node_traits::to_value_ptr( res.pLeaf );
pNewInternal->infinite_key( 1 );
}
pNewInternal->m_pLeft.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
- pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_release );
+ pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
}
else {
assert( !res.pLeaf->is_internal());
key_extractor()( pNewInternal->m_Key, val );
pNewInternal->m_pLeft.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
- pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_release );
+ pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
assert( !res.pLeaf->infinite_key());
}
update_ptr updCur( res.updParent.ptr());
if ( res.pParent->m_pUpdate.compare_exchange_strong( updCur, update_ptr( pOp, update_desc::IFlag ),
- memory_model::memory_order_acquire, atomics::memory_order_relaxed ))
+ memory_model::memory_order_acq_rel, atomics::memory_order_acquire ))
{
// do insert
help_insert( pOp );