X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=blobdiff_plain;f=test%2Funit%2Ftree%2Fintrusive_ellenbintree_hp.cpp;h=0c26a804861b5a2fafafe361dd81eddae60230dc;hp=b55ed62e4b0a76eeda59fe5f6a8fdbff03485539;hb=305da3404a293d5e5c4e76eb6660eeda5a7d4413;hpb=a8e2b827ac369f56546b7a5593c210cb356a754c diff --git a/test/unit/tree/intrusive_ellenbintree_hp.cpp b/test/unit/tree/intrusive_ellenbintree_hp.cpp index b55ed62e..0c26a804 100644 --- a/test/unit/tree/intrusive_ellenbintree_hp.cpp +++ b/test/unit/tree/intrusive_ellenbintree_hp.cpp @@ -5,7 +5,7 @@ Source code repo: http://github.com/khizmax/libcds/ Download: http://sourceforge.net/projects/libcds/files/ - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -25,12 +25,13 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test_intrusive_tree_hp.h" #include +#include "test_ellen_bintree_update_desc_pool.h" namespace { namespace ci = cds::intrusive; @@ -45,23 +46,14 @@ namespace { typedef base_class::key_type key_type; typedef typename base_class::base_int_item< ci::ellen_bintree::node> base_item_type; - typedef ci::ellen_bintree::internal_node< key_type, base_item_type > internal_base_node; - typedef ci::ellen_bintree::update_desc< base_item_type, internal_base_node > update_base_desc; - typedef typename base_class::member_int_item< ci::ellen_bintree::node> member_item_type; - typedef ci::ellen_bintree::internal_node< key_type, member_item_type > internal_member_node; - typedef ci::ellen_bintree::update_desc< member_item_type, internal_member_node > update_member_desc; void SetUp() { - struct list_traits : public ci::ellen_bintree::traits - { - typedef ci::ellen_bintree::base_hook< ci::opt::gc> hook; - }; - typedef ci::EllenBinTree< gc_type, key_type, base_item_type > set_type; + typedef ci::EllenBinTree< gc_type, key_type, base_item_type > tree_type; // +1 - for guarded_ptr - cds::gc::hp::GarbageCollector::Construct( set_type::c_nHazardPtrCount + 1, 1, 16 ); + cds::gc::hp::GarbageCollector::Construct( tree_type::c_nHazardPtrCount + 1, 1, 16 ); cds::threading::Manager::attachThread(); } @@ -82,7 +74,7 @@ namespace { TEST_F( IntrusiveEllenBinTree_HP, base_cmp ) { typedef ci::EllenBinTree< gc_type, key_type, base_item_type, - ci::ellen_bintree::make_traits< + ci::ellen_bintree::make_traits< ci::opt::type_traits< generic_traits > ,ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >>> ,ci::opt::compare< cmp> @@ -96,7 +88,7 @@ namespace { TEST_F( IntrusiveEllenBinTree_HP, base_less ) { typedef ci::EllenBinTree< gc_type, key_type, base_item_type, - ci::ellen_bintree::make_traits< + ci::ellen_bintree::make_traits< ci::opt::type_traits< generic_traits > ,ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >>> ,ci::opt::less< less> @@ -110,7 +102,7 @@ namespace { TEST_F( IntrusiveEllenBinTree_HP, base_item_counter ) { typedef ci::EllenBinTree< gc_type, key_type, base_item_type, - ci::ellen_bintree::make_traits< + ci::ellen_bintree::make_traits< ci::opt::type_traits< generic_traits > ,ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >>> ,ci::opt::compare< cmp> @@ -157,5 +149,147 @@ namespace { test( t ); } + TEST_F( IntrusiveEllenBinTree_HP, base_update_desc_pool ) + { + struct tree_traits: public generic_traits + { + typedef ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >> hook; + typedef base_class::less less; + typedef cds::atomicity::item_counter item_counter; + typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator; + }; + + typedef ci::EllenBinTree< gc_type, key_type, base_item_type, tree_traits > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, base_update_desc_lazy_pool ) + { + struct tree_traits: public generic_traits + { + typedef ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >> hook; + typedef base_class::less less; + typedef cds::atomicity::item_counter item_counter; + typedef cds::memory::pool_allocator update_desc_allocator; + }; + + typedef ci::EllenBinTree< gc_type, key_type, base_item_type, tree_traits > tree_type; + + tree_type t; + test( t ); + } + + // member hook + TEST_F( IntrusiveEllenBinTree_HP, member_cmp ) + { + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, + ci::ellen_bintree::make_traits< + ci::opt::type_traits< generic_traits > + ,ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember), ci::opt::gc< gc_type >>> + ,ci::opt::compare< cmp> + >::type + > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, member_less ) + { + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, + ci::ellen_bintree::make_traits< + ci::opt::type_traits< generic_traits > + ,ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >>> + ,ci::opt::less< less> + >::type + > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, member_item_counter ) + { + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, + ci::ellen_bintree::make_traits< + ci::opt::type_traits< generic_traits > + ,ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >>> + ,ci::opt::compare< cmp> + ,ci::opt::item_counter< simple_item_counter > + >::type + > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, member_backoff ) + { + struct tree_traits: public generic_traits + { + typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook; + typedef cmp compare; + typedef base_class::less less; + typedef cds::atomicity::item_counter item_counter; + typedef cds::backoff::yield back_off; + }; + + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, member_seq_cst ) + { + struct tree_traits: public generic_traits + { + typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook; + typedef cmp compare; + typedef base_class::less less; + typedef cds::atomicity::item_counter item_counter; + typedef cds::backoff::pause back_off; + typedef ci::opt::v::sequential_consistent memory_model; + }; + + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, member_update_desc_pool ) + { + struct tree_traits: public generic_traits + { + typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook; + typedef base_class::less less; + typedef cds::atomicity::item_counter item_counter; + typedef cds::memory::pool_allocator update_desc_allocator; + }; + + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type; + + tree_type t; + test( t ); + } + + TEST_F( IntrusiveEllenBinTree_HP, member_update_desc_lazy_pool ) + { + struct tree_traits: public generic_traits + { + typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook; + typedef base_class::less less; + typedef cds::atomicity::item_counter item_counter; + typedef cds::memory::pool_allocator update_desc_allocator; + }; + + typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type; + + tree_type t; + test( t ); + } } // namespace