#include <cds/intrusive/segmented_queue.h>
#include <cds/gc/hp.h>
-#include <cds/gc/hrc.h>
#include <cds/gc/dhp.h>
#include <boost/intrusive/slist.hpp>
// OptimisticQueue
- typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- > OptimisticQueue_HP;
-
- typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
- > OptimisticQueue_HP_seqcst;
+ struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
+ {
+ typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
+ };
+ typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
- typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- > OptimisticQueue_PTB;
+ struct traits_OptimisticQueue_HP_seqcst : public
+ cds::intrusive::optimistic_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ , cds::opt::memory_model< cds::opt::v::sequential_consistent >
+ >::type
+ {};
+ typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
- typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
- > OptimisticQueue_PTB_seqcst;
+ struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
+ {
+ typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
+ };
+ typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
+ struct traits_OptimisticQueue_DHP_seqcst: public
+ cds::intrusive::optimistic_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ , cds::opt::memory_model< cds::opt::v::sequential_consistent >
+ >::type
+ {};
+ typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
// OptimisticQueue + item counter
- typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- > OptimisticQueue_HP_ic;
+ struct traits_OptimisticQueue_HP_ic: public
+ cds::intrusive::optimistic_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ , cds::opt::item_counter< cds::atomicity::item_counter >
+ >::type
+ {};
+ typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
- typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- > OptimisticQueue_PTB_ic;
+ struct traits_OptimisticQueue_DHP_ic: public
+ cds::intrusive::optimistic_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ , cds::opt::item_counter< cds::atomicity::item_counter >
+ >::type
+ {};
+ typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
// OptimisticQueue + stat
- typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- ,cds::opt::stat< cds::intrusive::queue_stat<> >
- > OptimisticQueue_HP_stat;
+ struct traits_OptimisticQueue_HP_stat: public
+ cds::intrusive::optimistic_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
+ >::type
+ {};
+ typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
- typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- ,cds::opt::stat< cds::intrusive::queue_stat<> >
- > OptimisticQueue_PTB_stat;
+ struct traits_OptimisticQueue_DHP_stat: public
+ cds::intrusive::optimistic_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
+ >::type
+ {};
+ typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
// TsigasCycleQueue
class TsigasCycleQueue_dyn
- : public cds::intrusive::TsigasCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+ : public cds::intrusive::TsigasCycleQueue< T,
+ typename cds::intrusive::tsigas_queue::make_traits<
+ cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+ >::type
>
{
- typedef cds::intrusive::TsigasCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+ typedef cds::intrusive::TsigasCycleQueue< T,
+ typename cds::intrusive::tsigas_queue::make_traits<
+ cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+ >::type
> base_class;
public:
TsigasCycleQueue_dyn()
};
class TsigasCycleQueue_dyn_ic
- : public cds::intrusive::TsigasCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
+ : public cds::intrusive::TsigasCycleQueue< T,
+ typename cds::intrusive::tsigas_queue::make_traits<
+ cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+ ,cds::opt::item_counter< cds::atomicity::item_counter >
+ >::type
>
{
- typedef cds::intrusive::TsigasCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
+ typedef cds::intrusive::TsigasCycleQueue< T,
+ typename cds::intrusive::tsigas_queue::make_traits<
+ cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+ ,cds::opt::item_counter< cds::atomicity::item_counter >
+ >::type
> base_class;
public:
TsigasCycleQueue_dyn_ic()
};
// VyukovMPMCCycleQueue
+ struct traits_VyukovMPMCCycleQueue_dyn : public cds::intrusive::vyukov_queue::traits
+ {
+ typedef cds::opt::v::dynamic_buffer< int > buffer;
+ };
class VyukovMPMCCycleQueue_dyn
- : public cds::intrusive::VyukovMPMCCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- >
+ : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
{
- typedef cds::intrusive::VyukovMPMCCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- > base_class;
+ typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn > base_class;
public:
VyukovMPMCCycleQueue_dyn()
: base_class( 1024 * 64 )
}
};
+ struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
+ {
+ typedef cds::atomicity::item_counter item_counter;
+ };
class VyukovMPMCCycleQueue_dyn_ic
- : public cds::intrusive::VyukovMPMCCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- >
+ : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic >
{
- typedef cds::intrusive::VyukovMPMCCycleQueue< T
- ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- > base_class;
+ typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
public:
VyukovMPMCCycleQueue_dyn_ic()
: base_class( 1024 * 64 )
};
// BasketQueue
- typedef cds::intrusive::BasketQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- > BasketQueue_HP;
-
- typedef cds::intrusive::BasketQueue<cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
- > BasketQueue_HP_seqcst;
-
- typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
- > BasketQueue_HRC;
+ struct traits_BasketQueue_HP : public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
- typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
- ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
- > BasketQueue_HRC_seqcst;
+ struct traits_BasketQueue_HP_seqcst: public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ , cds::opt::memory_model< cds::opt::v::sequential_consistent >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
- typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- > BasketQueue_PTB;
+ struct traits_BasketQueue_DHP : public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
- typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
- > BasketQueue_PTB_seqcst;
+ struct traits_BasketQueue_DHP_seqcst: public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ , cds::opt::memory_model< cds::opt::v::sequential_consistent >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
// BasketQueue + item counter
- typedef cds::intrusive::BasketQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- > BasketQueue_HP_ic;
-
- typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- > BasketQueue_HRC_ic;
+ struct traits_BasketQueue_HP_ic : public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ ,cds::opt::item_counter< cds::atomicity::item_counter >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
- typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- > BasketQueue_PTB_ic;
+ struct traits_BasketQueue_DHP_ic : public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ ,cds::opt::item_counter< cds::atomicity::item_counter >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
// BasketQueue + stat
- typedef cds::intrusive::BasketQueue< cds::gc::HP, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
- ,cds::opt::stat< cds::intrusive::queue_stat<> >
- > BasketQueue_HP_stat;
-
- typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
- ,cds::opt::stat< cds::intrusive::queue_stat<> >
- > BasketQueue_HRC_stat;
+ struct traits_BasketQueue_HP_stat : public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+ , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
- typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
- ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
- ,cds::opt::stat< cds::intrusive::queue_stat<> >
- > BasketQueue_PTB_stat;
+ struct traits_BasketQueue_DHP_stat : public
+ cds::intrusive::basket_queue::make_traits <
+ cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
+ , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
+ > ::type
+ {};
+ typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
// FCQueue
class traits_FCQueue_delay2:
// *********************************************
// Queue statistics
namespace std {
-
+ /*
// cds::intrusive::queue_stat
template <typename Counter>
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
{
return o
<< "\tStatistics:\n"
<< "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
- << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
<< "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
- << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
<< "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
<< "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
}
-
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
{
return o;
}
+ */
- static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
+
+ template <typename Counter>
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
+ {
+ return o
+ << "\tStatistics:\n"
+ << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
+ << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
+ << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
+ << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
+ }
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& s)
{
return o;
}
- // cds::intrusive::optimistic_queue::stat
template <typename Counter>
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
+ static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
{
return o
- << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
- << "\t\t"
- << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
+ << "\tStatistics:\n"
+ << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
+ << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
}
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
+ static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
{
return o;
}
- // cds::intrusive::basket_queue::stat
+ static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
+ {
+ return o;
+ }
+
+ // cds::intrusive::optimistic_queue::stat
template <typename Counter>
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
+ static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
{
return o
- << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
- << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
- << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
+ << "\tStatistics:\n"
+ << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
+ << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
+ << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
}
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
+ static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
{
return o;
}