Psyllid  v1.12.4
Project 8 Data Acquisisition Software
locked_resource.hh
Go to the documentation of this file.
1 /*
2  * locked_resource.hh
3  *
4  * Created on: Feb 2, 2016
5  * Author: nsoblath
6  */
7 
8 #ifndef PSYLLID_LOCKED_RESOURCE_HH_
9 #define PSYLLID_LOCKED_RESOURCE_HH_
10 
11 #include <atomic>
12 #include <memory>
13 #include <mutex>
14 
15 namespace psyllid
16 {
17 
18  template< class x_resource, class x_parent, class x_mutex = std::mutex, class x_lock = std::unique_lock< x_mutex > >
20  {
21  public:
22  typedef std::shared_ptr< x_resource > resource_ptr_t;
23  typedef x_resource resource_t;
24 
26  locked_resource( locked_resource&& a_orig );
27  virtual ~locked_resource();
28 
30 
31  resource_t* operator->() const;
32 
33  bool have_lock() const;
34 
35  void unlock();
36 
37  private:
38  friend x_parent;
39  locked_resource( resource_ptr_t a_resource, x_mutex& a_mutex );
40 
41  locked_resource( const locked_resource& ) = delete;
42  locked_resource& operator=( const locked_resource& ) = delete;
43 
44  resource_ptr_t f_resource;
45  x_lock f_lock;
46  std::atomic< bool > f_have_lock;
47  };
48 
49  template< class x_resource, class x_parent, class x_mutex, class x_lock >
51  f_resource(),
52  f_lock(),
53  f_have_lock( false )
54  {}
55 
56  template< class x_resource, class x_parent, class x_mutex, class x_lock >
58  f_resource( std::move( a_orig.f_resource ) ),
59  f_lock( std::move( a_orig.f_lock ) ),
60  f_have_lock( f_lock.owns_lock() )
61  {
62  a_orig.f_resource.reset();
63  a_orig.f_lock.release();
64  a_orig.f_have_lock.store( false );
65  }
66 
67  template< class x_resource, class x_parent, class x_mutex, class x_lock >
69  f_resource( a_resource ),
70  f_lock( a_mutex ),
71  f_have_lock( f_lock.owns_lock() )
72  {}
73 
74  template< class x_resource, class x_parent, class x_mutex, class x_lock >
76  {}
77 
78  template< class x_resource, class x_parent, class x_mutex, class x_lock >
80  {
81  f_resource = std::move( a_rhs.f_resource );
82  a_rhs.f_resource.reset();
83  f_lock = std::move( a_rhs.f_lock );
84  a_rhs.f_lock.release();
85  f_have_lock.store( a_rhs.f_have_lock.load() );
86  a_rhs.f_have_lock.store( false );
87  return *this;
88  }
89 
90  template< class x_resource, class x_parent, class x_mutex, class x_lock >
92  {
93  return f_resource.get();
94  }
95 
96  template< class x_resource, class x_parent, class x_mutex, class x_lock >
98  {
99  return f_have_lock.load();
100  }
101 
102  template< class x_resource, class x_parent, class x_mutex, class x_lock >
104  {
105  f_resource.reset();
106  f_lock.unlock();
107  f_have_lock.store( false );
108  return;
109  }
110 
111 
112 } /* namespace psyllid */
113 
114 
115 #endif /* PSYLLID_LOCKED_RESOURCE_HH_ */
std::shared_ptr< x_resource > resource_ptr_t
STL namespace.
locked_resource & operator=(locked_resource &&a_rhs)
std::atomic< bool > f_have_lock
resource_t * operator->() const