From ec5e65cb042011c31933943152ebb257a314c7dc Mon Sep 17 00:00:00 2001 From: khizmax Date: Wed, 12 Nov 2014 16:19:31 +0300 Subject: [PATCH] movable exempt_ptr: MichaelList --- cds/container/michael_kvlist_rcu.h | 21 +++++++++---------- cds/container/michael_list_rcu.h | 19 ++++++++--------- cds/intrusive/michael_list_rcu.h | 19 ++++++++--------- .../ordered_list/hdr_intrusive_michael.h | 16 ++++++++------ tests/test-hdr/ordered_list/hdr_michael.h | 16 ++++++++------ tests/test-hdr/ordered_list/hdr_michael_kv.h | 16 ++++++++------ 6 files changed, 58 insertions(+), 49 deletions(-) diff --git a/cds/container/michael_kvlist_rcu.h b/cds/container/michael_kvlist_rcu.h index 0b0e4958..5be3c92c 100644 --- a/cds/container/michael_kvlist_rcu.h +++ b/cds/container/michael_kvlist_rcu.h @@ -127,9 +127,9 @@ namespace cds { namespace container { public: /// pointer to extracted node - typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer, + using exempt_ptr = cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer, cds::urcu::details::conventional_exempt_pair_cast - > exempt_ptr; + >; protected: //@cond @@ -510,8 +510,8 @@ namespace cds { namespace container { /** @anchor cds_nonintrusive_MichaelKVList_rcu_extract The function searches an item with key equal to \p key in the list, - unlinks it from the list, and returns pointer to an item found in \p dest argument. - If \p key is not found the function returns \p false. + unlinks it from the list, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found. + If \p key is not found the function returns 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 list @@ -535,7 +535,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 ( theList.extract( p, 10 )) { + p = theList.extract( 10 ); + if ( p ) { // do something with p ... } @@ -546,10 +547,9 @@ namespace cds { namespace container { \endcode */ template - bool extract( exempt_ptr& dest, K const& key ) + exempt_ptr extract( K const& key ) { - dest = extract_at( head(), key, intrusive_key_comparator() ); - return !dest.empty(); + return exempt_ptr( extract_at( head(), key, intrusive_key_comparator() )); } /// Extracts an item from the list using \p pred predicate for searching @@ -560,10 +560,9 @@ namespace cds { namespace container { \p pred must imply the same element order as \ref key_comparator. */ template - bool extract_with( exempt_ptr& dest, K const& key, Less pred ) + exempt_ptr extract_with( K const& key, Less pred ) { - dest = extract_at( head(), key, typename maker::template less_wrapper::type() ); - return !dest.empty(); + return exempt_ptr( extract_at( head(), key, typename maker::template less_wrapper::type() )); } /// Finds the key \p key diff --git a/cds/container/michael_list_rcu.h b/cds/container/michael_list_rcu.h index 4c3d502e..f28ffbe7 100644 --- a/cds/container/michael_list_rcu.h +++ b/cds/container/michael_list_rcu.h @@ -136,7 +136,7 @@ namespace cds { namespace container { //@endcond public: - typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer > exempt_ptr; ///< pointer to extracted node + using exempt_ptr = cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer >; ///< pointer to extracted node private: //@cond @@ -488,8 +488,8 @@ namespace cds { namespace container { /** @anchor cds_nonintrusive_MichaelList_rcu_extract The function searches an item with key equal to \p key in the list, - unlinks it from the list, and returns pointer to an item found in \p dest argument. - If the item with the key equal to \p key is not found the function returns \p false. + unlinks it from the list, 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 returns 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 list @@ -513,7 +513,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 ( theList.extract( p, 10 )) { + p = theList.extract( 10 ) + if ( p ) { // do something with p ... } @@ -524,10 +525,9 @@ namespace cds { namespace container { \endcode */ template - bool extract( exempt_ptr& dest, Q const& key ) + exempt_ptr extract( Q const& key ) { - dest = extract_at( head(), key, intrusive_key_comparator() ); - return !dest.empty(); + return exempt_ptr( extract_at( head(), key, intrusive_key_comparator() )); } /// Extracts an item from the list using \p pred predicate for searching @@ -539,10 +539,9 @@ namespace cds { namespace container { \p pred must imply the same element order as \ref key_comparator. */ template - bool extract_with( exempt_ptr& dest, Q const& key, Less pred ) + exempt_ptr extract_with( Q const& key, Less pred ) { - dest = extract_at( head(), key, typename maker::template less_wrapper::type() ); - return !dest.empty(); + return exempt_ptr( extract_at( head(), key, typename maker::template less_wrapper::type() )); } /// Finds the key \p key diff --git a/cds/intrusive/michael_list_rcu.h b/cds/intrusive/michael_list_rcu.h index 0f29034a..5e19b02f 100644 --- a/cds/intrusive/michael_list_rcu.h +++ b/cds/intrusive/michael_list_rcu.h @@ -119,7 +119,7 @@ namespace cds { namespace intrusive { //@endcond public: - typedef cds::urcu::exempt_ptr< gc, value_type, value_type, clear_and_dispose, void > exempt_ptr ; ///< pointer to extracted node + using exempt_ptr = cds::urcu::exempt_ptr< gc, value_type, value_type, clear_and_dispose, void >; ///< pointer to extracted node protected: //@cond @@ -481,8 +481,8 @@ namespace cds { namespace intrusive { /** @anchor cds_intrusive_MichaelList_rcu_extract The function searches an item with key equal to \p key in the list, - unlinks it from the list, and returns pointer to an item found in \p dest parameter. - If \p key is not found the function returns \p false, \p dest is empty. + unlinks it from the list, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found. + If \p key is not found the function returns 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 unlinks the item from the list @@ -507,7 +507,8 @@ namespace cds { namespace intrusive { // Now, you can apply extract function // Note that you must not delete the item found inside the RCU lock - if ( theList.extract( p1, 10 )) { + p1 = theList.extract( 10 ) + if ( p1 ) { // do something with p1 ... } @@ -520,10 +521,9 @@ namespace cds { namespace intrusive { \endcode */ template - bool extract( exempt_ptr& dest, Q const& key ) + exempt_ptr extract( Q const& key ) { - dest = extract_at( m_pHead, key, key_comparator() ); - return !dest.empty(); + return exempt_ptr( extract_at( m_pHead, key, key_comparator() )); } /// Extracts an item from the list using \p pred predicate for searching @@ -535,10 +535,9 @@ namespace cds { namespace intrusive { \p pred must imply the same element order as \ref key_comparator. */ template - bool extract_with( exempt_ptr& dest, Q const& key, Less pred ) + exempt_ptr extract_with( Q const& key, Less pred ) { - dest = extract_at( m_pHead, key, cds::opt::details::make_comparator_from_less() ); - return !dest.empty(); + return exempt_ptr( extract_at( m_pHead, key, cds::opt::details::make_comparator_from_less() )); } /// Find the key \p val diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael.h b/tests/test-hdr/ordered_list/hdr_intrusive_michael.h index c1d3049c..bbf23856 100644 --- a/tests/test-hdr/ordered_list/hdr_intrusive_michael.h +++ b/tests/test-hdr/ordered_list/hdr_intrusive_michael.h @@ -576,7 +576,8 @@ namespace ordlist { CPPUNIT_CHECK( pGet->nKey == a[i] ); CPPUNIT_CHECK( pGet->nVal == a[i] * 2 ); - CPPUNIT_ASSERT( l.extract( ep, a[i] )); + ep = l.extract( a[i] ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( ep->nKey == a[i] ); CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 ); @@ -585,7 +586,7 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get( a[i] ) == nullptr ); - CPPUNIT_CHECK( !l.extract( ep, a[i] )); + CPPUNIT_CHECK( !l.extract( a[i] )); CPPUNIT_CHECK( ep.empty() ); } } @@ -594,7 +595,8 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get( a[0] ) == nullptr ); - CPPUNIT_CHECK( !l.extract( ep, a[0] ) ); + ep = l.extract( a[0] ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } // Apply retired pointer @@ -614,7 +616,8 @@ namespace ordlist { CPPUNIT_CHECK( pGet->nKey == a[i] ); CPPUNIT_CHECK( pGet->nVal == a[i] * 2 ); - CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() )); + ep = l.extract_with( itm, other_less() ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( ep->nKey == a[i] ); CPPUNIT_CHECK( ep->nVal == a[i] * 2 ); @@ -623,7 +626,8 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr ); - CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() )); + ep = l.extract_with( itm, other_less() ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } @@ -632,7 +636,7 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get_with( other_item( 0 ), other_less() ) == nullptr ); - CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() )); + CPPUNIT_CHECK( !l.extract_with( other_item(0), other_less() )); CPPUNIT_CHECK( ep.empty() ); } // Apply retired pointer diff --git a/tests/test-hdr/ordered_list/hdr_michael.h b/tests/test-hdr/ordered_list/hdr_michael.h index b612cbbd..314df8cc 100644 --- a/tests/test-hdr/ordered_list/hdr_michael.h +++ b/tests/test-hdr/ordered_list/hdr_michael.h @@ -560,7 +560,8 @@ namespace ordlist { CPPUNIT_CHECK( pGet->nKey == a[i] ); CPPUNIT_CHECK( pGet->nVal == a[i] * 2 ); - CPPUNIT_ASSERT( l.extract( ep, a[i] )); + ep = l.extract( a[i] ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( ep->nKey == a[i] ); CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 ); @@ -569,7 +570,8 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get( a[i] ) == nullptr ); - CPPUNIT_CHECK( !l.extract( ep, a[i] )); + ep = l.extract( a[i] ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } @@ -578,7 +580,7 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get( a[0] ) == nullptr ); - CPPUNIT_CHECK( !l.extract( ep, a[0] ) ); + CPPUNIT_CHECK( !l.extract( a[0] ) ); CPPUNIT_CHECK( ep.empty() ); } @@ -596,7 +598,8 @@ namespace ordlist { CPPUNIT_CHECK( pGet->nKey == a[i] ); CPPUNIT_CHECK( pGet->nVal == a[i] * 2 ); - CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() )); + ep = l.extract_with( itm, other_less() ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( ep->nKey == a[i] ); CPPUNIT_CHECK( ep->nVal == a[i] * 2 ); @@ -605,7 +608,8 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr ); - CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() )); + ep = l.extract_with( itm, other_less() ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } @@ -614,7 +618,7 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get_with( other_item( 0 ), other_less() ) == nullptr ); - CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() )); + CPPUNIT_CHECK( !l.extract_with( other_item(0), other_less() )); CPPUNIT_CHECK( ep.empty() ); } } diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv.h b/tests/test-hdr/ordered_list/hdr_michael_kv.h index 24f77f4f..49ff561a 100644 --- a/tests/test-hdr/ordered_list/hdr_michael_kv.h +++ b/tests/test-hdr/ordered_list/hdr_michael_kv.h @@ -397,7 +397,8 @@ namespace ordlist { CPPUNIT_CHECK( pGet->first == a[i] ); CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 ); - CPPUNIT_ASSERT( l.extract( ep, a[i] )); + ep = l.extract( a[i] ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( ep->first == a[i] ); CPPUNIT_CHECK( (*ep).second.m_val == a[i] * 2 ); @@ -406,7 +407,8 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get( a[i] ) == nullptr ); - CPPUNIT_CHECK( !l.extract( ep, a[i] )); + ep = l.extract( a[i] ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } @@ -415,7 +417,7 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get( a[0] ) == nullptr ); - CPPUNIT_CHECK( !l.extract( ep, a[0] ) ); + CPPUNIT_CHECK( !l.extract( a[0] ) ); CPPUNIT_CHECK( ep.empty() ); } @@ -433,7 +435,8 @@ namespace ordlist { CPPUNIT_CHECK( pGet->first == a[i] ); CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 ); - CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() )); + ep = l.extract_with( itm, other_less() ); + CPPUNIT_ASSERT( ep ); CPPUNIT_ASSERT( !ep.empty() ); CPPUNIT_CHECK( ep->first == a[i] ); CPPUNIT_CHECK( ep->second.m_val == a[i] * 2 ); @@ -442,7 +445,8 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr ); - CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() )); + ep = l.extract_with( itm, other_less() ); + CPPUNIT_CHECK( !ep ); CPPUNIT_CHECK( ep.empty() ); } } @@ -451,7 +455,7 @@ namespace ordlist { { rcu_lock lock; CPPUNIT_CHECK( l.get_with( 3.14f, other_less() ) == nullptr ); - CPPUNIT_CHECK( !l.extract_with( ep, 3.14f, other_less() )); + CPPUNIT_CHECK( !l.extract_with( 3.14f, other_less() )); CPPUNIT_CHECK( ep.empty() ); } } -- 2.34.1