From: khizmax Date: Thu, 19 Mar 2015 21:10:49 +0000 (+0300) Subject: Added more node version checking to BronsonAVLTreeMap X-Git-Tag: v2.1.0~296^2~20 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3a629b530cfc34b6b8524d2c85bc654696aaf176;p=libcds.git Added more node version checking to BronsonAVLTreeMap --- diff --git a/cds/container/impl/bronson_avltree_map_rcu.h b/cds/container/impl/bronson_avltree_map_rcu.h index 87a85f6a..0439e7df 100644 --- a/cds/container/impl/bronson_avltree_map_rcu.h +++ b/cds/container/impl/bronson_avltree_map_rcu.h @@ -947,7 +947,6 @@ namespace cds { namespace container { } } else if ( nChildVersion != node_type::unlinked ) { - if ( pNode->version( memory_model::memory_order_acquire ) != nVersion ) { m_stat.onFindRetry(); return find_result::retry; @@ -957,6 +956,11 @@ namespace cds { namespace container { if ( found != find_result::retry ) return found; } + + if ( pNode->version( memory_model::memory_order_acquire ) != nVersion ) { + m_stat.onFindRetry(); + return find_result::retry; + } } } @@ -1098,6 +1102,11 @@ namespace cds { namespace container { result = try_update( key, cmp, nFlags, funcUpdate, pNode, pChild, nChildVersion, disp ); } } + + if ( result == update_flags::retry && pNode->version( memory_model::memory_order_relaxed ) != nVersion ) { + m_stat.onUpdateRetry(); + return update_flags::retry; + } } while ( result == update_flags::retry ); return result; } @@ -1149,6 +1158,11 @@ namespace cds { namespace container { result = try_remove( key, cmp, func, pNode, pChild, nChildVersion, disp ); } } + + if ( result == update_flags::retry && pNode->version( memory_model::memory_order_relaxed ) != nVersion ) { + m_stat.onRemoveRetry(); + return update_flags::retry; + } } while ( result == update_flags::retry ); return result; } @@ -1196,6 +1210,11 @@ namespace cds { namespace container { result = try_extract_minmax( nDir, func, pNode, pChild, nChildVersion, disp ); } } + + if ( result == update_flags::retry && pNode->version( memory_model::memory_order_relaxed ) != nVersion ) { + m_stat.onRemoveRetry(); + return update_flags::retry; + } } while ( result == update_flags::retry ); return result; }