+ void help_remove( int nLevel, node_type* pPred, marked_node_ptr pCur, marked_node_ptr pSucc )
+ {
+ marked_node_ptr p( pCur.ptr() );
+
+ if ( pCur->is_upper_level( nLevel )) {
+ typename gc::Guard hp;
+ if ( hp.protect( pCur->next( nLevel ), gc_protect ) == pSucc &&
+ pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+ memory_model::memory_order_acquire, atomics::memory_order_relaxed ) )
+ {
+ if ( pCur->level_unlinked() ) {
+ gc::retire( node_traits::to_value_ptr( pCur.ptr() ), dispose_node );
+ m_Stat.onEraseWhileFind();
+ }
+ }
+ }
+ }
+