From: khizmax Date: Wed, 12 Nov 2014 19:49:51 +0000 (+0300) Subject: movable exempt_ptr: MichaelSet/Map X-Git-Tag: v2.0.0~105 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=commitdiff_plain;h=edde46e4647cc1887b1a103de43c3f9d26ea1662 movable exempt_ptr: MichaelSet/Map --- diff --git a/cds/container/michael_map_rcu.h b/cds/container/michael_map_rcu.h index 54cd1b57..8888759a 100644 --- a/cds/container/michael_map_rcu.h +++ b/cds/container/michael_map_rcu.h @@ -527,8 +527,8 @@ namespace cds { namespace container { /// Extracts an item from the map /** \anchor cds_nonintrusive_MichaelHashMap_rcu_extract The function searches an item with key equal to \p key, - unlinks it from the map, places item pointer into \p dest argument, and returns \p true. - If the item is not found the function return \p false. + unlinks it from the map, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found. + If the item is not found the function return an empty \p exempt_ptr. @note The function does NOT call RCU read-side lock or synchronization, and does NOT dispose the item found. It just excludes the item from the map @@ -555,7 +555,8 @@ namespace cds { namespace container { // Now, you can apply extract function // Note that you must not delete the item found inside the RCU lock - if ( theMap.extract( p, 10 )) { + p = theMap.extract( 10 ); + if ( p ) { // do something with p ... } @@ -567,13 +568,12 @@ namespace cds { namespace container { \endcode */ template - bool extract( exempt_ptr& dest, K const& key ) + exempt_ptr extract( K const& key ) { - if ( bucket( key ).extract( dest, key )) { + exempt_ptr p = bucket( key ).extract( key ); + if ( p ) --m_ItemCounter; - return true; - } - return false; + return p; } /// Extracts an item from the map using \p pred predicate for searching @@ -584,13 +584,12 @@ namespace cds { namespace container { \p pred must imply the same element order as the comparator used for building the map. */ template - bool extract_with( exempt_ptr& dest, K const& key, Less pred ) + exempt_ptr extract_with( K const& key, Less pred ) { - if ( bucket( key ).extract_with( dest, key, pred )) { + exempt_ptr p = bucket( key ).extract_with( key, pred ); + if ( p ) --m_ItemCounter; - return true; - } - return false; + return p; } /// Finds the key \p key diff --git a/cds/container/michael_set_rcu.h b/cds/container/michael_set_rcu.h index e1e617c1..27cec415 100644 --- a/cds/container/michael_set_rcu.h +++ b/cds/container/michael_set_rcu.h @@ -449,8 +449,8 @@ namespace cds { namespace container { /// Extracts an item from the set /** \anchor cds_nonintrusive_MichaelHashSet_rcu_extract The function searches an item with key equal to \p key in the set, - unlinks it from the set, places item pointer into \p dest argument, and returns \p true. - If the item with the key equal to \p key is not found the function return \p false. + unlinks it from the set, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found. + If the item with the key equal to \p key is not found the function return an empty \p exempt_ptr. @note The function does NOT call RCU read-side lock or synchronization, and does NOT dispose the item found. It just excludes the item from the set @@ -477,7 +477,8 @@ namespace cds { namespace container { // Now, you can apply extract function // Note that you must not delete the item found inside the RCU lock - if ( theSet.extract( p, 10 )) { + p = theSet.extract( 10 ); + if ( p ) { // do something with p ... } @@ -489,13 +490,12 @@ namespace cds { namespace container { \endcode */ template - bool extract( exempt_ptr& dest, Q const& key ) + exempt_ptr extract( Q const& key ) { - if ( bucket( key ).extract( dest, key )) { + exempt_ptr p = bucket( key ).extract( key ); + if ( p ) --m_ItemCounter; - return true; - } - return false; + return p; } /// Extracts an item from the set using \p pred predicate for searching @@ -506,13 +506,12 @@ namespace cds { namespace container { \p pred must imply the same element order as the comparator used for building the set. */ template - bool extract_with( exempt_ptr& dest, Q const& key, Less pred ) + exempt_ptr extract_with( Q const& key, Less pred ) { - if ( bucket( key ).extract_with( dest, key, pred )) { + exempt_ptr p = bucket( key ).extract_with( key, pred ); + if ( p ) --m_ItemCounter; - return true; - } - return false; + return p; } /// Finds the key \p key diff --git a/tests/test-hdr/map/hdr_map.h b/tests/test-hdr/map/hdr_map.h index d27b3551..7cdfb1a4 100644 --- a/tests/test-hdr/map/hdr_map.h +++ b/tests/test-hdr/map/hdr_map.h @@ -286,7 +286,8 @@ namespace map { CPPUNIT_CHECK( pVal->first == nKey ); CPPUNIT_CHECK( pVal->second.m_val == nKey ); - CPPUNIT_ASSERT( m.extract( ep, nKey )); + ep = m.extract( nKey ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( pVal->first == ep->first ); CPPUNIT_CHECK( pVal->second.m_val == ep->second.m_val ); @@ -295,7 +296,8 @@ namespace map { { rcu_lock l; CPPUNIT_CHECK( m.get( nKey ) == nullptr ); - CPPUNIT_CHECK( !m.extract( ep, nKey )); + ep = m.extract( nKey ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); nKey = arr[i+1]; @@ -304,7 +306,8 @@ namespace map { CPPUNIT_CHECK( pVal->first == nKey ); CPPUNIT_CHECK( pVal->second.m_val == nKey ); - CPPUNIT_ASSERT( m.extract_with( ep, other_item(nKey), other_less() )); + ep = m.extract_with( other_item( nKey ), other_less() ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( pVal->first == ep->first ); CPPUNIT_CHECK( pVal->second.m_val == (*ep).second.m_val ); @@ -313,7 +316,7 @@ namespace map { { rcu_lock l; CPPUNIT_CHECK( m.get_with( other_item(nKey), other_less() ) == nullptr ); - CPPUNIT_CHECK( !m.extract_with( ep, other_item(nKey), other_less() )); + CPPUNIT_CHECK( !m.extract_with( other_item(nKey), other_less() )); CPPUNIT_CHECK( ep.empty() ); } } @@ -322,7 +325,8 @@ namespace map { { rcu_lock l; CPPUNIT_CHECK( m.get( int(nLimit / 2) ) == nullptr ); - CPPUNIT_CHECK( !m.extract( ep, int(nLimit / 2) )); + ep = m.extract( int( nLimit / 2 ) ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } diff --git a/tests/test-hdr/set/hdr_intrusive_set.h b/tests/test-hdr/set/hdr_intrusive_set.h index e58bbd61..aae9cbe3 100644 --- a/tests/test-hdr/set/hdr_intrusive_set.h +++ b/tests/test-hdr/set/hdr_intrusive_set.h @@ -1031,7 +1031,8 @@ namespace set { CPPUNIT_CHECK( pVal->nKey == nKey ); CPPUNIT_CHECK( pVal->nVal == nKey * 2 ); - CPPUNIT_ASSERT( s.extract( ep, nKey )); + ep = s.extract( nKey ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( pVal->nKey == ep->nKey ); CPPUNIT_CHECK( pVal->nVal == (*ep).nVal ); @@ -1040,7 +1041,7 @@ namespace set { { rcu_lock l; CPPUNIT_CHECK( s.get( nKey ) == nullptr ); - CPPUNIT_CHECK( !s.extract( ep, nKey )); + CPPUNIT_CHECK( !s.extract( nKey )); CPPUNIT_CHECK( ep.empty() ); nKey = arr[i+1]; @@ -1049,7 +1050,8 @@ namespace set { CPPUNIT_CHECK( pVal->nKey == nKey ); CPPUNIT_CHECK( pVal->nVal == nKey * 2 ); - CPPUNIT_ASSERT( s.extract_with( ep, nKey, less() )); + ep = s.extract_with( nKey, less() ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( pVal->nKey == ep->nKey ); CPPUNIT_CHECK( pVal->nVal == (*ep).nVal ); @@ -1058,7 +1060,8 @@ namespace set { { rcu_lock l; CPPUNIT_CHECK( s.get_with( nKey, less() ) == nullptr ); - CPPUNIT_CHECK( !s.extract_with( ep, nKey, less() )); + ep = s.extract_with( nKey, less() ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } @@ -1067,7 +1070,8 @@ namespace set { { rcu_lock l; CPPUNIT_CHECK( s.get( 100 ) == nullptr ); - CPPUNIT_CHECK( !s.extract( ep, 100 )); + ep = s.extract( 100 ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } diff --git a/tests/test-hdr/set/hdr_set.h b/tests/test-hdr/set/hdr_set.h index f7ac01dc..a546eb47 100644 --- a/tests/test-hdr/set/hdr_set.h +++ b/tests/test-hdr/set/hdr_set.h @@ -437,7 +437,8 @@ namespace set { CPPUNIT_CHECK( pVal->nKey == nKey ); CPPUNIT_CHECK( pVal->nVal == nKey ); - CPPUNIT_ASSERT( s.extract( ep, nKey )); + ep = s.extract( nKey ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( pVal->nKey == ep->nKey ); CPPUNIT_CHECK( pVal->nVal == (*ep).nVal ); @@ -446,7 +447,8 @@ namespace set { { rcu_lock l; CPPUNIT_CHECK( s.get( nKey ) == nullptr ); - CPPUNIT_CHECK( !s.extract( ep, nKey )); + ep = s.extract( nKey ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); nKey = arr[i+1]; @@ -455,7 +457,8 @@ namespace set { CPPUNIT_CHECK( pVal->nKey == nKey ); CPPUNIT_CHECK( pVal->nVal == nKey ); - CPPUNIT_ASSERT( s.extract_with( ep, other_item(nKey), other_less() )); + ep = s.extract_with( other_item( nKey ), other_less() ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( pVal->nKey == ep->nKey ); CPPUNIT_CHECK( pVal->nVal == (*ep).nVal ); @@ -464,7 +467,7 @@ namespace set { { rcu_lock l; CPPUNIT_CHECK( s.get_with( other_item( nKey ), other_less() ) == nullptr ); - CPPUNIT_CHECK( !s.extract_with( ep, other_item(nKey), other_less() )); + CPPUNIT_CHECK( !s.extract_with( other_item(nKey), other_less() )); CPPUNIT_CHECK( ep.empty() ); } } @@ -473,7 +476,8 @@ namespace set { { rcu_lock l; CPPUNIT_CHECK( s.get( int( nLimit / 2 ) ) == nullptr ); - CPPUNIT_CHECK( !s.extract( ep, int(nLimit / 2) )); + ep = s.extract( int( nLimit / 2 ) ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } }