projects
/
libcds.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
0ad0c0c
)
movable exempt_ptr: MichaelSet/Map
author
khizmax
<libcds.dev@gmail.com>
Wed, 12 Nov 2014 19:49:51 +0000
(22:49 +0300)
committer
khizmax
<libcds.dev@gmail.com>
Wed, 12 Nov 2014 19:49:51 +0000
(22:49 +0300)
cds/container/michael_map_rcu.h
patch
|
blob
|
history
cds/container/michael_set_rcu.h
patch
|
blob
|
history
tests/test-hdr/map/hdr_map.h
patch
|
blob
|
history
tests/test-hdr/set/hdr_intrusive_set.h
patch
|
blob
|
history
tests/test-hdr/set/hdr_set.h
patch
|
blob
|
history
diff --git
a/cds/container/michael_map_rcu.h
b/cds/container/michael_map_rcu.h
index 54cd1b5710e9cd82e978c92a82e4fbd36c0f3ab1..8888759a8980aeae18bb92519ebb02b91ef29e79 100644
(file)
--- 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,
/// 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
@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
// 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
...
}
// do something with p
...
}
@@
-567,13
+568,12
@@
namespace cds { namespace container {
\endcode
*/
template <typename K>
\endcode
*/
template <typename K>
-
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;
--m_ItemCounter;
- return true;
- }
- return false;
+ return p;
}
/// Extracts an item from the map using \p pred predicate for searching
}
/// 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 <typename K, typename Less>
\p pred must imply the same element order as the comparator used for building the map.
*/
template <typename K, typename Less>
-
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;
--m_ItemCounter;
- return true;
- }
- return false;
+ return p;
}
/// Finds the key \p key
}
/// Finds the key \p key
diff --git
a/cds/container/michael_set_rcu.h
b/cds/container/michael_set_rcu.h
index e1e617c1342d9e3a373db7084136f2077f58b3a5..27cec415e486eefc94455ab6e8beb5710acaf533 100644
(file)
--- 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,
/// 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
@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
// 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
...
}
// do something with p
...
}
@@
-489,13
+490,12
@@
namespace cds { namespace container {
\endcode
*/
template <typename Q>
\endcode
*/
template <typename Q>
-
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;
--m_ItemCounter;
- return true;
- }
- return false;
+ return p;
}
/// Extracts an item from the set using \p pred predicate for searching
}
/// 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 <typename Q, typename Less>
\p pred must imply the same element order as the comparator used for building the set.
*/
template <typename Q, typename Less>
-
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;
--m_ItemCounter;
- return true;
- }
- return false;
+ return p;
}
/// Finds the key \p key
}
/// Finds the key \p key
diff --git
a/tests/test-hdr/map/hdr_map.h
b/tests/test-hdr/map/hdr_map.h
index d27b3551c96d7f23ae604d4276207a698ce99102..7cdfb1a407d22cc3e7672a03f33a217f86b6d691 100644
(file)
--- 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_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 );
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 );
{
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];
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_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 );
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 );
{
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() );
}
}
CPPUNIT_CHECK( ep.empty() );
}
}
@@
-322,7
+325,8
@@
namespace map {
{
rcu_lock l;
CPPUNIT_CHECK( m.get( int(nLimit / 2) ) == nullptr );
{
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() );
}
}
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 e58bbd61764133254b16fc7682c228a9b9b0cf28..aae9cbe36eec26445c946fa8737ece3f782c72ff 100644
(file)
--- 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_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 );
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 );
{
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];
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_CHECK( pVal->nKey == nKey );
CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
- CPPUNIT_ASSERT( s.extract_with( ep, nKey, less<value_type>() ));
+ ep = s.extract_with( nKey, less<value_type>() );
+ CPPUNIT_ASSERT( ep );
CPPUNIT_ASSERT( !ep.empty() );
CPPUNIT_CHECK( pVal->nKey == ep->nKey );
CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
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<value_type>() ) == nullptr );
{
rcu_lock l;
CPPUNIT_CHECK( s.get_with( nKey, less<value_type>() ) == nullptr );
- CPPUNIT_CHECK( !s.extract_with( ep, nKey, less<value_type>() ));
+ ep = s.extract_with( nKey, less<value_type>() );
+ CPPUNIT_CHECK( !ep );
CPPUNIT_CHECK( ep.empty() );
}
}
CPPUNIT_CHECK( ep.empty() );
}
}
@@
-1067,7
+1070,8
@@
namespace set {
{
rcu_lock l;
CPPUNIT_CHECK( s.get( 100 ) == nullptr );
{
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() );
}
CPPUNIT_CHECK( ep.empty() );
}
diff --git
a/tests/test-hdr/set/hdr_set.h
b/tests/test-hdr/set/hdr_set.h
index f7ac01dc8dda1ae043eded04daadaa341795575d..a546eb47b798709a2960940533396ff366406826 100644
(file)
--- 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_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 );
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 );
{
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];
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_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 );
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 );
{
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() );
}
}
CPPUNIT_CHECK( ep.empty() );
}
}
@@
-473,7
+476,8
@@
namespace set {
{
rcu_lock l;
CPPUNIT_CHECK( s.get( int( nLimit / 2 ) ) == nullptr );
{
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() );
}
}
CPPUNIT_CHECK( ep.empty() );
}
}