Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
LockedHandle.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_LOCKEDHANDLE
2 #define GAUDIKERNEL_LOCKEDHANDLE 1
3 
4 #include <mutex>
5 
6 // =======================================================================
27 template <class T, class MutexType = std::mutex>
28 class LockedHandle {
29 public:
30  LockedHandle( T* ptr, MutexType& mut ) : m_ptr( ptr ), m_mutex( &mut ) {}
31  LockedHandle( T* ptr, MutexType* mut ) : m_ptr( ptr ), m_mutex( mut ) {}
32  LockedHandle( T* ptr ) : m_ptr( ptr ), m_mutex( 0 ) {}
33  LockedHandle() : m_ptr( nullptr ), m_mutex( nullptr ) {}
34 
35  void set( T* ptr, MutexType* mut ) {
36  m_ptr = ptr;
37  m_mutex = mut;
38  }
39 
40  void setMutex( MutexType* mut ) { m_mutex = mut; }
41 
42  T* get() const { return m_ptr; }
43 
44  class Guard {
45  Guard( const Guard& a ) = delete;
46 
47  public:
48  Guard( Guard&& a ) : m_ptr( a.m_ptr ), m_mutex( a.m_mutex ) { a.m_mutex = nullptr; }
49 
50  Guard( T* ptr, MutexType& mutex ) : m_ptr( ptr ), m_mutex( &mutex ) { m_mutex->lock(); }
51  ~Guard() { m_mutex->unlock(); }
52  T& operator*() { return *m_ptr; }
53  T* operator->() { return m_ptr; }
54 
55  operator T&() { return *m_ptr; }
56 
57  private:
58  T* m_ptr{nullptr};
59  MutexType* m_mutex{nullptr};
60  };
61 
62  class ConstGuard {
63  ConstGuard( const ConstGuard& a ) = delete;
64 
65  public:
66  ConstGuard( ConstGuard&& a ) : m_ptr( a.m_ptr ), m_mutex( a.m_mutex ) { a.m_mutex = nullptr; }
67 
68  ConstGuard( const T* ptr, MutexType& mutex ) : m_ptr( ptr ), m_mutex( &mutex ) { m_mutex->lock(); }
69  ~ConstGuard() { m_mutex->unlock(); }
70  const T& operator*() const { return *m_ptr; }
71  const T* operator->() const { return m_ptr; }
72 
73  operator const T&() const { return *m_ptr; }
74 
75  private:
76  const T* m_ptr;
77  MutexType* m_mutex;
78  };
79 
81  Guard operator*() { return Guard( m_ptr, *m_mutex ); }
82 
84  Guard operator->() { return Guard( m_ptr, *m_mutex ); }
85 
87  ConstGuard operator*() const { return ConstGuard( m_ptr, *m_mutex ); }
88 
90  ConstGuard operator->() const { return ConstGuard( m_ptr, *m_mutex ); }
91 
92  operator bool() const { return m_ptr; }
93 
94 private:
95  T* m_ptr;
96  mutable MutexType* m_mutex;
97 };
98 
99 #endif
Guard operator->()
Aquire and release the lock before and after the object is accessed.
Definition: LockedHandle.h:84
Guard(const Guard &a)=delete
Guard(T *ptr, MutexType &mutex)
Definition: LockedHandle.h:50
ConstGuard(const T *ptr, MutexType &mutex)
Definition: LockedHandle.h:68
LockedHandle(T *ptr)
Definition: LockedHandle.h:32
ConstGuard operator*() const
Aquire and release the lock before and after the const object is accessed.
Definition: LockedHandle.h:87
const T * operator->() const
Definition: LockedHandle.h:71
MutexType * m_mutex
Definition: LockedHandle.h:96
Provides automatic lock/unlock access to a class upon deref of ptr.
Definition: LockedHandle.h:28
MutexType * m_mutex
Definition: LockedHandle.h:59
LockedHandle(T *ptr, MutexType *mut)
Definition: LockedHandle.h:31
Guard operator*()
Aquire and release the lock before and after the object is accessed.
Definition: LockedHandle.h:81
LockedHandle(T *ptr, MutexType &mut)
Definition: LockedHandle.h:30
ConstGuard(ConstGuard &&a)
Definition: LockedHandle.h:66
const T & operator*() const
Definition: LockedHandle.h:70
void setMutex(MutexType *mut)
Definition: LockedHandle.h:40
ConstGuard operator->() const
Aquire and release the lock before and after the const object is accessed.
Definition: LockedHandle.h:90