Merge pull request #26 from krinkinmu/build-script-wip
[libcds.git] / cds / sync / monitor.h
index 60d3afcd6eaabb3af3109ef1790fd5196f1517e0..2ac85a330b2140cd9e371dddafe18c397fc8f7a9 100644 (file)
@@ -6,13 +6,10 @@
 #include <cds/details/defs.h>
 
 namespace cds { namespace sync {
-
     /**
         @page cds_sync_monitor Synchronization monitor
-
         A <a href="http://en.wikipedia.org/wiki/Monitor_%28synchronization%29">monitor</a> is synchronization construct
         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 +34,11 @@ namespace cds { namespace sync {
         <b>How to use</b>
 
         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 {
@@ -51,23 +48,19 @@ namespace cds { namespace sync {
             struct node_injection: public Node
             {
                 // Monitor data to inject into container's node
-                // ... 
+                // ...
             };
-
-            // Locks the node 
+            // Locks the node
             template <typename Node>
             void lock( Node& node );
-
             // Unlocks the node
             template <typename Node>
             void unlock( Node& node );
-
             // Scoped lock applyes RAII to Monitor
             template <typename Node>
             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:
         \code
         template <typename SyncMonitor>
@@ -77,7 +70,6 @@ namespace cds { namespace sync {
             typename SyncMonitor::node_injection m_SyncMonitorInjection;
         };
         \endcode
-
         The monitor must be a member of your container:
         \code
         template <typename GC, typename T, typename Traits>
@@ -90,7 +82,6 @@ namespace cds { namespace sync {
         };
         \endcode
     */
-
     /// Monitor scoped lock (RAII)
     /**
         Template arguments:
@@ -103,13 +94,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 +107,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