Added injected monitor
[libcds.git] / cds / sync / injected_monitor.h
1 //$$CDS-header$$
2
3 #ifndef CDSLIB_SYNC_INJECTED_MONITOR_H
4 #define CDSLIB_SYNC_INJECTED_MONITOR_H
5
6 namespace cds { namespace sync {
7
8     /// Monitor that injects a lock as a member into a class
9     /**
10         Template arguments:
11         - Lock - lock type like \p std::mutex or \p cds::sync::spin
12     */
13     template <typename Lock>
14     class injected_monitor
15     {
16     public:
17         typedef Lock lock_type;
18
19         template <typename T>
20         struct wrapper : public T
21         {
22             using T::T;
23             mutable lock_type m_Lock;
24
25             void lock() const
26             {
27                 m_Lock.lock;
28             }
29
30             void unlock() const
31             {
32                 m_Lock.unlock();
33             }
34         };
35
36         template <typename T>
37         void lock( T const& p ) const
38         {
39             p.lock();
40         }
41
42         template <typename T>
43         void unlock( T const& p ) const
44         {
45             p.unlock();
46         }
47
48         template <typename T>
49         class scoped_lock
50         {
51             T const& m_Locked;
52
53         public:
54             scoped_lock( injected_monitor const&, T const& p )
55                 : m_Locked( p )
56             {
57                 p.lock();
58             }
59
60             ~scoped_lock()
61             {
62                 p.unlock();
63             }
64         };
65     };
66 }} // namespace cds::sync
67
68 #endif // #ifndef CDSLIB_SYNC_INJECTED_MONITOR_H