X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fintrusive%2Fmspriority_queue.h;h=2788fa3a282bde9bc2d82dc1daeacea45d883170;hb=f07a234c4c0a654f3a62d185a9d58f4d095d27b4;hp=bd94dab3b51460122d51ddd48040dfccc316e055;hpb=239d8e6b0abbff4917f329bc8ba277c7972957d2;p=libcds.git diff --git a/cds/intrusive/mspriority_queue.h b/cds/intrusive/mspriority_queue.h index bd94dab3..2788fa3a 100644 --- a/cds/intrusive/mspriority_queue.h +++ b/cds/intrusive/mspriority_queue.h @@ -3,7 +3,8 @@ #ifndef __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H #define __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H -#include +#include // std::unique_lock +#include #include #include #include @@ -11,7 +12,6 @@ #include #include #include -#include namespace cds { namespace intrusive { @@ -54,11 +54,11 @@ namespace cds { namespace intrusive { //@endcond }; - /// Type traits for MSPriorityQueue - struct type_traits { + /// MSPriorityQueue traits + struct traits { /// Storage type /** - The storage type for the heap array. Default is cds::opt::v::dynamic_buffer. + The storage type for the heap array. Default is \p cds::opt::v::dynamic_buffer. You may specify any type of buffer's value since at instantiation time the \p buffer::rebind member metafunction is called to change type @@ -72,7 +72,7 @@ namespace cds { namespace intrusive { */ typedef opt::none compare; - /// specifies binary predicate used for priority comparing. + /// Specifies binary predicate used for priority comparing. /** Default is \p std::less. */ @@ -86,7 +86,7 @@ namespace cds { namespace intrusive { /// Internal statistics /** - Possible types: mspriority_queue::empty_stat (the default), mspriority_queue::stat + Possible types: \p mspriority_queue::empty_stat (the default, no overhead), \p mspriority_queue::stat or any other with interface like \p %mspriority_queue::stat */ typedef empty_stat stat; @@ -94,9 +94,17 @@ namespace cds { namespace intrusive { /// Metafunction converting option list to traits /** - This is a wrapper for cds::opt::make_options< type_traits, Options...> - - See \ref MSPriorityQueue, \ref type_traits, \ref cds::opt::make_options. + \p Options: + - \p opt::buffer - the buffer type for heap array. Possible type are: \p opt::v::static_buffer, \p opt::v::dynamic_buffer. + Default is \p %opt::v::dynamic_buffer. + You may specify any type of values for the buffer since at instantiation time + the \p buffer::rebind member metafunction is called to change the type of values stored in the buffer. + - \p opt::compare - priority compare functor. No default functor is provided. + If the option is not specified, the \p opt::less is used. + - \p opt::less - specifies binary predicate used for priority compare. Default is \p std::less. + - \p opt::lock_type - lock type. Default is \p cds::lock::Spin. + - \p opt::back_off - back-off strategy. Default is \p cds::backoff::yield + - \p opt::stat - internal statistics. Available types: \p mspriority_queue::stat, \p mspriority_queue::empty_stat (the default, no overhead) */ template struct make_traits { @@ -104,7 +112,7 @@ namespace cds { namespace intrusive { typedef implementation_defined type ; ///< Metafunction result # else typedef typename cds::opt::make_options< - typename cds::opt::find_type_traits< type_traits, Options... >::type + typename cds::opt::find_type_traits< traits, Options... >::type ,Options... >::type type; # endif @@ -133,24 +141,12 @@ namespace cds { namespace intrusive { single-lock algorithm. Template parameters: - - \p T - type to be stored in the list. The priority is a part of \p T type. - - \p Traits - type traits. See mspriority_queue::type_traits for explanation. - - It is possible to declare option-based queue with cds::container::mspriority_queue::make_traits - metafunction instead of \p Traits template argument. - Template argument list \p Options of \p %cds::container::mspriority_queue::make_traits metafunction are: - - opt::buffer - the buffer type for heap array. Possible type are: opt::v::static_buffer, opt::v::dynamic_buffer. - Default is \p %opt::v::dynamic_buffer. - You may specify any type of values for the buffer since at instantiation time - the \p buffer::rebind member metafunction is called to change the type of values stored in the buffer. - - opt::compare - priority compare functor. No default functor is provided. - If the option is not specified, the opt::less is used. - - opt::less - specifies binary predicate used for priority compare. Default is \p std::less. - - opt::lock_type - lock type. Default is cds::lock::Spin. - - opt::back_off - back-off strategy. Default is cds::backoff::yield - - opt::stat - internal statistics. Available types: mspriority_queue::stat, mspriority_queue::empty_stat (the default) + - \p T - type to be stored in the queue. The priority is a part of \p T type. + - \p Traits - type traits. See \p mspriority_queue::traits for explanation. + It is possible to declare option-based queue with \p cds::container::mspriority_queue::make_traits + metafunction instead of \p Traits template argument. */ - template + template class MSPriorityQueue: public cds::bounded_container { public: @@ -330,7 +326,7 @@ namespace cds { namespace intrusive { */ void clear() { - clear_with( []( value_type const& src ) {} ); + clear_with( []( value_type const& /*src*/ ) {} ); } /// Clears the queue (not atomic) @@ -353,7 +349,7 @@ namespace cds { namespace intrusive { while ( !empty() ) { value_type * pVal = pop(); if ( pVal ) - cds::unref(f)( *pVal ); + f( *pVal ); } } @@ -372,9 +368,8 @@ namespace cds { namespace intrusive { /// Returns current size of priority queue size_t size() const { - m_Lock.lock(); + std::unique_lock l( m_Lock ); size_t nSize = (size_t) m_ItemCounter.value(); - m_Lock.unlock(); return nSize; }