mrs_lib
Various reusable classes, functions and utilities for use in MRS projects
Loading...
Searching...
No Matches
lockable.h
1#pragma once
2
3#include <mutex>
4
5#if MRS_LIB_IGNORE_DEPRECATED_LOCKABLE
6#define MRS_LIB_DEPRECATED_LOCKABLE
7#else
8#define MRS_LIB_DEPRECATED_LOCKABLE [[deprecated("Use mrs_lib::OwningMutex instead.")]]
9#endif
10
11namespace mrs_lib
12{
13 template <typename LockedVarT, typename MutexT>
14 class Unlocker;
15
28 template <typename LockedVarT, typename MutexT = std::mutex>
29 class MRS_LIB_DEPRECATED_LOCKABLE Lockable
30 {
31 MutexT mtx;
32 LockedVarT locked_var;
33
35
36 public:
37 Lockable() = default;
38
39 Lockable(const LockedVarT& init_val) : locked_var(init_val)
40 {
41 }
42
43 Lockable(const LockedVarT&& init_val) : locked_var(init_val)
44 {
45 }
46
47 LockedVarT& unsafe_access()
48 {
49 return locked_var;
50 }
51
52 void set_mutexed(const LockedVarT& val)
53 {
54 std::scoped_lock lock(mtx);
55 locked_var = val;
56 }
57
58 LockedVarT get_mutexed()
59 {
60 std::scoped_lock lock(mtx);
61 return locked_var;
62 }
63
64 MutexT& mutex()
65 {
66 return mtx;
67 }
68 };
69
78 template <typename LockedVarT, typename MutexT>
79 class MRS_LIB_DEPRECATED_LOCKABLE Unlocker
80 {
81 public:
82 Unlocker(Lockable<LockedVarT, MutexT>& lockable) : lock(lockable.mtx), lockable(lockable)
83 {
84 }
85
86 LockedVarT& operator*()
87 {
88 return lockable.locked_var;
89 }
90
91 LockedVarT* operator->()
92 {
93 return &(lockable.locked_var);
94 }
95
96 private:
97 std::scoped_lock<MutexT> lock;
98 Lockable<LockedVarT>& lockable;
99 };
100
101} // namespace mrs_lib
102
103#undef MRS_LIB_DEPRECATED_LOCKABLE
Convenience class for safe and expressive management of mutexed variables.
Definition lockable.h:30
Convenience class for RAII-style access to a varible within a Lockable object.
Definition lockable.h:80
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition attitude_converter.h:24