+ void help_remove( int nLevel, node_type* pPred, marked_node_ptr pCur, marked_node_ptr pSucc )
+ {
+ typename gc::Guard succ_guard;
+ marked_node_ptr succ = succ_guard.protect( pCur->next( nLevel ), gc_protect );
+
+ typename node_type::state state = node_type::clean;
+ if ( succ == pSucc && ( succ.ptr() == nullptr ||
+ succ.ptr()->set_state( state, node_type::hand_off, memory_model::memory_order_acquire )))
+ {
+ marked_node_ptr p( pCur.ptr() );
+ if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( succ.ptr()),
+ memory_model::memory_order_acquire, atomics::memory_order_relaxed ) )
+ {
+ if ( nLevel == 0 ) {
+ gc::retire( node_traits::to_value_ptr( pCur.ptr() ), dispose_node );
+ m_Stat.onEraseWhileFind();
+ }
+ }
+
+ if ( succ.ptr() )
+ succ.ptr()->clear_state( memory_model::memory_order_release );
+ }
+ else
+ m_Stat.onNodeHandOffFailed();
+ }
+