X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=blobdiff_plain;f=cds%2Fsync%2Fmonitor.h;h=d03ab3e570ffad96a19be80f6a96987bbb963b3d;hp=60d3afcd6eaabb3af3109ef1790fd5196f1517e0;hb=HEAD;hpb=557a7d9d33be3992a9f9473595773a363d80229a diff --git a/cds/sync/monitor.h b/cds/sync/monitor.h index 60d3afcd..d03ab3e5 100644 --- a/cds/sync/monitor.h +++ b/cds/sync/monitor.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-2017 + + 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_SYNC_MONITOR_H #define CDSLIB_SYNC_MONITOR_H @@ -6,13 +34,10 @@ #include namespace cds { namespace sync { - /** @page cds_sync_monitor Synchronization monitor - - A monitor is synchronization construct + A monitor is synchronization construction that allows threads to have both mutual exclusion and the ability to wait (block) for a certain condition to become true. - Some blocking data structure algoritms like the trees require per-node locking. For huge trees containing millions of nodes it can be very inefficient to inject the lock object into each node. Moreover, some operating systems may not support @@ -37,11 +62,11 @@ namespace cds { namespace sync { How to use If you use a container from \p libcds that requires a monitor, you should just - specify required monitor type in container's traits. Usually, the monitor + specify required monitor type in container's traits. Usually, the monitor is specified by \p traits::sync_monitor typedef, or by \p cds::opt::sync_monitor option for container's \p make_traits metafunction. - If you're developing a new container algorithm, you should know internal monitor + If you're developing a new container algorithm, you should know internal monitor interface: \code class Monitor { @@ -50,25 +75,21 @@ namespace cds { namespace sync { template struct node_injection: public Node { - // Monitor data to inject into container's node - // ... + // Monitor data injecting into container's node + // ... }; - - // Locks the node + // Locks the node template void lock( Node& node ); - // Unlocks the node template void unlock( Node& node ); - // Scoped lock applyes RAII to Monitor template using scoped_lock = monitor_scoped_lock< pool_monitor, Node >; }; \endcode - - Monitor's data must be inject into container's node as \p m_SyncMonitorInjection data member: + Monitor's data must be injected into container's node as \p m_SyncMonitorInjection data member: \code template struct my_node @@ -77,7 +98,6 @@ namespace cds { namespace sync { typename SyncMonitor::node_injection m_SyncMonitorInjection; }; \endcode - The monitor must be a member of your container: \code template @@ -90,7 +110,6 @@ namespace cds { namespace sync { }; \endcode */ - /// Monitor scoped lock (RAII) /** Template arguments: @@ -103,13 +122,11 @@ namespace cds { namespace sync { public: typedef Monitor monitor_type; ///< Monitor type typedef Node node_type; ///< Node type - private: //@cond monitor_type& m_Monitor; ///< Monitor node_type const& m_Node; ///< Our locked node //@endcond - public: /// Makes exclusive access to the node \p p by \p monitor monitor_scoped_lock( monitor_type& monitor, node_type const& p ) @@ -118,15 +135,12 @@ namespace cds { namespace sync { { monitor.lock( p ); } - /// Unlocks the node ~monitor_scoped_lock() { m_Monitor.unlock( m_Node ); } }; - }} // namespace cds::sync - #endif // #ifndef CDSLIB_SYNC_MONITOR_H