Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  master (d98a2936)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
LockedHandle.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 
13 #include <mutex>
14 
35 template <class T, class MutexType = std::mutex>
36 class LockedHandle {
37 public:
38  LockedHandle( T* ptr, MutexType& mut ) : m_ptr( ptr ), m_mutex( &mut ) {}
39  LockedHandle( T* ptr, MutexType* mut ) : m_ptr( ptr ), m_mutex( mut ) {}
40  LockedHandle( T* ptr ) : m_ptr( ptr ), m_mutex( 0 ) {}
42 
43  void set( T* ptr, MutexType* mut ) {
44  m_ptr = ptr;
45  m_mutex = mut;
46  }
47 
48  void setMutex( MutexType* mut ) { m_mutex = mut; }
49 
50  T* get() const { return m_ptr; }
51 
52  class Guard {
53  Guard( const Guard& a ) = delete;
54 
55  public:
56  Guard( Guard&& a ) : m_ptr( a.m_ptr ), m_mutex( a.m_mutex ) { a.m_mutex = nullptr; }
57 
58  Guard( T* ptr, MutexType& mutex ) : m_ptr( ptr ), m_mutex( &mutex ) { m_mutex->lock(); }
59  ~Guard() { m_mutex->unlock(); }
60  T& operator*() { return *m_ptr; }
61  T* operator->() { return m_ptr; }
62 
63  operator T&() { return *m_ptr; }
64 
65  private:
66  T* m_ptr{ nullptr };
67  MutexType* m_mutex{ nullptr };
68  };
69 
70  class ConstGuard {
71  ConstGuard( const ConstGuard& a ) = delete;
72 
73  public:
74  ConstGuard( ConstGuard&& a ) : m_ptr( a.m_ptr ), m_mutex( a.m_mutex ) { a.m_mutex = nullptr; }
75 
76  ConstGuard( const T* ptr, MutexType& mutex ) : m_ptr( ptr ), m_mutex( &mutex ) { m_mutex->lock(); }
77  ~ConstGuard() { m_mutex->unlock(); }
78  const T& operator*() const { return *m_ptr; }
79  const T* operator->() const { return m_ptr; }
80 
81  operator const T&() const { return *m_ptr; }
82 
83  private:
84  const T* m_ptr;
85  MutexType* m_mutex;
86  };
87 
89  Guard operator*() { return Guard( m_ptr, *m_mutex ); }
90 
92  Guard operator->() { return Guard( m_ptr, *m_mutex ); }
93 
95  ConstGuard operator*() const { return ConstGuard( m_ptr, *m_mutex ); }
96 
98  ConstGuard operator->() const { return ConstGuard( m_ptr, *m_mutex ); }
99 
100  operator bool() const { return m_ptr; }
101 
102 private:
103  T* m_ptr;
104  mutable MutexType* m_mutex;
105 };
LockedHandle::Guard::Guard
Guard(T *ptr, MutexType &mutex)
Definition: LockedHandle.h:58
LockedHandle::Guard::m_mutex
MutexType * m_mutex
Definition: LockedHandle.h:67
LockedHandle::ConstGuard::operator->
const T * operator->() const
Definition: LockedHandle.h:79
LockedHandle::setMutex
void setMutex(MutexType *mut)
Definition: LockedHandle.h:48
LockedHandle::LockedHandle
LockedHandle(T *ptr, MutexType &mut)
Definition: LockedHandle.h:38
LockedHandle::ConstGuard::operator*
const T & operator*() const
Definition: LockedHandle.h:78
LockedHandle::Guard::Guard
Guard(Guard &&a)
Definition: LockedHandle.h:56
LockedHandle::set
void set(T *ptr, MutexType *mut)
Definition: LockedHandle.h:43
LockedHandle::get
T * get() const
Definition: LockedHandle.h:50
LockedHandle::LockedHandle
LockedHandle()
Definition: LockedHandle.h:41
LockedHandle::Guard::~Guard
~Guard()
Definition: LockedHandle.h:59
LockedHandle::operator*
Guard operator*()
Aquire and release the lock before and after the object is accessed.
Definition: LockedHandle.h:89
LockedHandle::m_mutex
MutexType * m_mutex
Definition: LockedHandle.h:104
LockedHandle::ConstGuard::m_ptr
const T * m_ptr
Definition: LockedHandle.h:84
LockedHandle::Guard::operator->
T * operator->()
Definition: LockedHandle.h:61
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
LockedHandle::LockedHandle
LockedHandle(T *ptr)
Definition: LockedHandle.h:40
LockedHandle::Guard
Definition: LockedHandle.h:52
LockedHandle::Guard::Guard
Guard(const Guard &a)=delete
LockedHandle::ConstGuard::m_mutex
MutexType * m_mutex
Definition: LockedHandle.h:85
LockedHandle::m_ptr
T * m_ptr
Definition: LockedHandle.h:103
LockedHandle::ConstGuard::ConstGuard
ConstGuard(const ConstGuard &a)=delete
LockedHandle::operator*
ConstGuard operator*() const
Aquire and release the lock before and after the const object is accessed.
Definition: LockedHandle.h:95
LockedHandle::ConstGuard::ConstGuard
ConstGuard(const T *ptr, MutexType &mutex)
Definition: LockedHandle.h:76
LockedHandle::ConstGuard::ConstGuard
ConstGuard(ConstGuard &&a)
Definition: LockedHandle.h:74
LockedHandle::operator->
Guard operator->()
Aquire and release the lock before and after the object is accessed.
Definition: LockedHandle.h:92
LockedHandle::Guard::operator*
T & operator*()
Definition: LockedHandle.h:60
LockedHandle::Guard::m_ptr
T * m_ptr
Definition: LockedHandle.h:66
LockedHandle::ConstGuard::~ConstGuard
~ConstGuard()
Definition: LockedHandle.h:77
LockedHandle::operator->
ConstGuard operator->() const
Aquire and release the lock before and after the const object is accessed.
Definition: LockedHandle.h:98
LockedHandle
Definition: LockedHandle.h:36
LockedHandle::ConstGuard
Definition: LockedHandle.h:70
LockedHandle::LockedHandle
LockedHandle(T *ptr, MutexType *mut)
Definition: LockedHandle.h:39