Added sync monitor for pool of mutexes
[libcds.git] / cds / sync / injecting_monitor.h
1 //$$CDS-header$$
2
3 #ifndef CDSLIB_SYNC_INJECTING_MONITOR_H
4 #define CDSLIB_SYNC_INJECTING_MONITOR_H
5
6 #include <cds/sync/monitor.h>
7 #ifndef CDS_CXX11_INHERITING_CTOR
8 #   include <utility> // std::forward
9 #endif
10
11 namespace cds { namespace sync {
12
13     /// @ref cds_sync_monitor "Monitor" that injects the lock into each node
14     /**
15         This simple monitor injects the lock object of type \p Lock into each node. 
16         The monitor is designed for user-space locking primitives like \ref sync::spin_lock "spin-lock".
17
18         Template arguments:
19         - Lock - lock type like \p std::mutex or \p cds::sync::spin
20     */
21     template <typename Lock>
22     class injecting_monitor
23     {
24     public:
25         typedef Lock lock_type; ///< Lock type
26
27         /// Monitor injection into \p Node
28         template <typename Node>
29         struct node_injection: public Node
30         {
31 #       ifdef CDS_CXX11_INHERITING_CTOR
32             using Node::Node;
33 #       else
34             // Inheriting ctor emulation
35             template <typename... Args>
36             node_injection( Args&&... args )
37                 : Node( std::forward<Args>( args )... )
38             {}
39 #       endif
40             mutable lock_type m_Lock; ///< Node-level lock
41         };
42
43         /// Makes exclusive access to node \p p
44         template <typename Node>
45         void lock( Node const& p ) const
46         {
47             p.m_Lock.lock();
48         }
49
50         /// Unlocks the node \p p
51         template <typename Node>
52         void unlock( Node const& p ) const
53         {
54             p.m_Lock.unlock();
55         }
56
57         /// Scoped lock
58         template <typename Node>
59         using scoped_lock = monitor_scoped_lock< injecting_monitor, Node > ;
60     };
61 }} // namespace cds::sync
62
63 #endif // #ifndef CDSLIB_SYNC_INJECTING_MONITOR_H