9#ifndef LLDB_UTILITY_LOCKED_H
10#define LLDB_UTILITY_LOCKED_H
12#include "llvm/Support/RWMutex.h"
17#include <shared_mutex>
28 decltype(
auto)
operator*()
const {
return *
Self()->m_ptr; }
30 explicit operator bool()
const {
return Raw() !=
nullptr; }
33 const Derived *
Self()
const {
return static_cast<const Derived *
>(
this); }
36 if constexpr (std::is_pointer_v<PtrT>)
39 return Self()->m_ptr.get();
54template <
typename PtrT,
typename Mutex = std::recursive_mutex>
66 assert(
m_lock.owns_lock() &&
"Locked requires an owning lock");
73 m_lock = std::move(other.m_lock);
74 m_ptr = std::exchange(other.m_ptr, PtrT{});
97template <
typename PtrT,
typename Mutex = llvm::sys::RWMutex>
107 if constexpr (std::is_pointer_v<PtrT>)
108 return std::is_const_v<std::remove_pointer_t<PtrT>>;
110 return std::is_const_v<typename PtrT::element_type>;
113 "SharedLocked requires a pointer to a const-qualified type; "
114 "use the SharedLockedPtr/SP/UP aliases.");
125 m_ptr(std::move(p)) {
126 assert(
m_lock->owns_lock() &&
"SharedLocked requires an owning lock");
135 m_lock = std::move(other.m_lock);
136 m_ptr = std::exchange(other.m_ptr, PtrT{});
148template <
typename T,
typename Mutex = std::recursive_mutex>
151template <
typename T,
typename Mutex = std::recursive_mutex>
154template <
typename T,
typename Mutex = std::recursive_mutex>
161template <
typename T,
typename Mutex = llvm::sys::RWMutex>
164template <
typename T,
typename Mutex = llvm::sys::RWMutex>
167template <
typename T,
typename Mutex = llvm::sys::RWMutex>
A move-only RAII handle that pairs a pointer-like value with an exclusive lock on a caller-supplied m...
Locked(const Locked &)=delete
Locked(lock_type lock, PtrT p)
Locked(mutex_type &m, PtrT p)
std::unique_lock< Mutex > lock_type
Locked & operator=(const Locked &)=delete
Locked & operator=(Locked &&other)
A copyable RAII handle that pairs a pointer-like value with a shared (reader) lock on a caller-suppli...
static constexpr bool PointeeIsConst
SharedLocked(lock_type lock, PtrT p)
SharedLocked(const SharedLocked &)=default
std::shared_lock< Mutex > lock_type
SharedLocked & operator=(SharedLocked &&other)
std::shared_ptr< lock_type > m_lock
SharedLocked(SharedLocked &&other)
SharedLocked(mutex_type &m, PtrT p)
SharedLocked & operator=(const SharedLocked &)=default
Common pointer-like accessors shared by Locked and SharedLocked.
const Derived * Self() const
A class that represents a running process on the host machine.
SharedLocked< std::shared_ptr< const T >, Mutex > SharedLockedSP
SharedLocked< std::unique_ptr< const T >, Mutex > SharedLockedUP
Locked< T *, Mutex > LockedPtr
Exclusive (write) access aliases.
Locked< std::unique_ptr< T >, Mutex > LockedUP
Locked< std::shared_ptr< T >, Mutex > LockedSP
SharedLocked< const T *, Mutex > SharedLockedPtr
Shared (read) access aliases.