X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=cds%2Fintrusive%2Fvyukov_mpmc_cycle_queue.h;h=709d69b27e90f7ecae3e2ad1e0dd1448d88282f3;hb=dcfc955eac8d172e1da77d150edc6e17b54ef5a0;hp=1a44211d2a21fbc04f3e566874d70a2e0ebb026b;hpb=92242dd6abd8fb9b72bc44f20a1ffa609881dc9a;p=libcds.git diff --git a/cds/intrusive/vyukov_mpmc_cycle_queue.h b/cds/intrusive/vyukov_mpmc_cycle_queue.h index 1a44211d..709d69b2 100644 --- a/cds/intrusive/vyukov_mpmc_cycle_queue.h +++ b/cds/intrusive/vyukov_mpmc_cycle_queue.h @@ -1,4 +1,32 @@ -//$$CDS-header$$ +/* + This file is a part of libcds - Concurrent Data Structures library + + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016 + + 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: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + 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. +*/ #ifndef CDSLIB_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H #define CDSLIB_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H @@ -23,23 +51,24 @@ namespace cds { namespace intrusive { /// Metafunction converting option list to \p vyukov_queue::traits /** Supported \p Options are: - - \p opt::buffer - the buffer type for internal cyclic array. Possible types are: - \p opt::v::dynamic_buffer (the default), \p opt::v::static_buffer. The type of + - \p opt::buffer - an uninitialized buffer type for internal cyclic array. Possible types are: + \p opt::v::uninitialized_dynamic_buffer (the default), \p opt::v::uninitialized_static_buffer. The type of element in the buffer is not important: it will be changed via \p rebind metafunction. - \p opt::disposer - the functor used for dispose removed items. Default is \p opt::v::empty_disposer. This option is used only in \p clear() member function. - \p opt::item_counter - the type of item counting feature. Default is \p cds::atomicity::empty_item_counter (item counting disabled) To enable item counting use \p cds::atomicity::item_counter + - \p opt::back_off - back-off strategy used. If the option is not specified, the \p cds::backoff::Default is used. - \p opt::padding - padding for internal critical atomic data. Default is \p opt::cache_line_padding - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default) - or \p opt::v::sequential_consistent (sequentially consisnent memory model). + or \p opt::v::sequential_consistent (sequentially consistent memory model). - Example: declare \p %VyukovMPMCCycleQueue with item counting and static iternal buffer of size 1024: + Example: declare \p %VyukovMPMCCycleQueue with item counting and static internal buffer of size 1024: \code typedef cds::intrusive::VyukovMPMCCycleQueue< Foo, typename cds::intrusive::vyukov_queue::make_traits< - cds::opt::buffer< cds::opt::v::static_buffer< void *, 1024 >, - cds::opt::item_counte< cds::atomicity::item_counter > + cds::opt::buffer< cds::opt::v::uninitialized_static_buffer< void *, 1024 >, + cds::opt::item_counter< cds::atomicity::item_counter > >::type > myQueue; \endcode @@ -66,17 +95,17 @@ namespace cds { namespace intrusive { Template parameters: - \p T - type stored in queue. - - \p Traits - queue traits, default is \p vykov_queue::traits. You can use \p vykov_queue::make_traits - metafunction to make your traits or just derive your traits from \p %vykov_queue::traits: + - \p Traits - queue traits, default is \p vyukov_queue::traits. You can use \p vyukov_queue::make_traits + metafunction to make your traits or just derive your traits from \p %vyukov_queue::traits: \code - struct myTraits: public cds::intrusive::vykov_queue::traits { + struct myTraits: public cds::intrusive::vyukov_queue::traits { typedef cds::atomicity::item_counter item_counter; }; typedef cds::intrusive::VyukovMPMCCycleQueue< Foo, myTraits > myQueue; // Equivalent make_traits example: typedef cds::intrusive::VyukovMPMCCycleQueue< cds::gc::HP, Foo, - typename cds::intrusive::vykov_queue::make_traits< + typename cds::intrusive::vyukov_queue::make_traits< cds::opt::item_counter< cds::atomicity::item_counter > >::type > myQueue; @@ -95,7 +124,7 @@ namespace cds { namespace intrusive { // Queue of Foo pointers, capacity is 1024, statically allocated buffer: typedef cds::intrusive::VyukovMPMCCycleQueue< Foo, typename cds::intrusive::vyukov_queue::make_traits< - cds::opt::buffer< cds::opt::v::static_buffer< Foo, 1024 > > + cds::opt::buffer< cds::opt::v::uninitialized_static_buffer< Foo, 1024 > > >::type > static_queue; static_queue stQueue; @@ -103,7 +132,7 @@ namespace cds { namespace intrusive { // Queue of Foo pointers, capacity is 1024, dynamically allocated buffer: struct queue_traits: public cds::intrusive::vyukov_queue::traits { - typedef cds::opt::v::dynamic_buffer< Foo > buffer; + typedef cds::opt::v::uninitialized_dynamic_buffer< Foo > buffer; }; typedef cds::intrusive::VyukovMPMCCycleQueue< Foo, queue_traits > dynamic_queue; dynamic_queue dynQueue( 1024 ); @@ -119,9 +148,10 @@ namespace cds { namespace intrusive { public: typedef T value_type; ///< type of data to be stored in the queue typedef Traits traits; ///< Queue traits - typedef typename traits::item_counter item_counter; ///< Item counter type - typedef typename traits::memory_model memory_model; ///< Memory ordering. See cds::opt::memory_model option - typedef typename traits::disposer disposer; ///< Item disposer + typedef typename traits::item_counter item_counter; ///< Item counter type + typedef typename traits::memory_model memory_model; ///< Memory ordering. See cds::opt::memory_model option + typedef typename traits::disposer disposer; ///< Item disposer + typedef typename traits::back_off back_off; ///< back-off strategy public: /// Rebind template arguments @@ -133,7 +163,7 @@ namespace cds { namespace intrusive { public: /// Constructs the queue of capacity \p nCapacity /** - For \p cds::opt::v::static_buffer the \p nCapacity parameter is ignored. + For \p cds::opt::v::uninitialized_static_buffer the \p nCapacity parameter is ignored. */ VyukovMPMCCycleQueue( size_t nCapacity = 0 ) : base_class( nCapacity )