BronsonAVLTreeMap: fixed update() bug
authorkhizmax <libcds.dev@gmail.com>
Sat, 4 Apr 2015 13:46:47 +0000 (16:46 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sat, 4 Apr 2015 13:46:47 +0000 (16:46 +0300)
cds/container/impl/bronson_avltree_map_rcu.h

index bbc93ffa393be1867590911ecf499f1dfe0c6bd7..8524ddfc30611c176eda77316cf49efa4a6ca0e9 100644 (file)
@@ -1312,6 +1312,7 @@ namespace cds { namespace container {
         int try_update_node( int nFlags, Func funcUpdate, node_type * pNode, version_type nVersion, rcu_disposer& disp )
         {
             mapped_type pOld;
+            bool bInserted;
             assert( pNode != nullptr );
             {
                 node_scoped_lock l( m_Monitor, *pNode );
@@ -1330,6 +1331,7 @@ namespace cds { namespace container {
                 }
 
                 pOld = pNode->value( memory_model::memory_order_relaxed );
+                bInserted = pOld == nullptr;
                 mapped_type pVal = funcUpdate( pNode );
                 if ( pVal == pOld )
                     pOld = nullptr;
@@ -1344,6 +1346,11 @@ namespace cds { namespace container {
                 m_stat.onDisposeValue();
             }
 
+            if ( bInserted ) {
+                m_stat.onInsertSuccess();
+                return update_flags::result_inserted;
+            }
+
             m_stat.onUpdateSuccess();
             return update_flags::result_updated;
         }