ReXGlue SDK
Toggle main menu visibility
Loading...
Searching...
No Matches
lock_order.h
Go to the documentation of this file.
1
10
11
#pragma once
12
13
#include <mutex>
14
#include <shared_mutex>
15
16
#include <
rex/platform.h
>
17
#include <
rex/types.h
>
18
#include <
rex/utility.h
>
19
20
namespace
rex::platform
{
21
26
enum class
LockRank
: u8 {
27
kLeaf
= 0xFF,
28
};
29
36
using
LockOrderHandler
= void (*)(
LockRank
held,
LockRank
acquiring);
37
44
REX_API
LockOrderHandler
SetLockOrderHandler
(
LockOrderHandler
handler);
45
47
REX_API
void
PushLockRank
(
LockRank
rank);
48
49
REX_API
void
PopLockRank(
LockRank
rank);
50
52
class
RankedMutex :
public
rex::NonCopyable
{
53
public
:
54
explicit
RankedMutex(
LockRank
rank) : rank_(rank) {}
55
56
void
lock() {
57
PushLockRank
(rank_);
58
mutex_.lock();
59
}
60
61
bool
try_lock() {
62
if
(!mutex_.try_lock()) {
63
return
false
;
64
}
65
PushLockRank
(rank_);
66
return
true
;
67
}
68
69
void
unlock() {
70
PopLockRank(rank_);
71
mutex_.unlock();
72
}
73
74
private
:
75
std::mutex mutex_;
76
LockRank
rank_;
77
};
78
80
class
RankedSharedMutex :
public
rex::NonCopyable
{
81
public
:
82
explicit
RankedSharedMutex(
LockRank
rank) : rank_(rank) {}
83
84
void
lock() {
85
PushLockRank
(rank_);
86
mutex_.lock();
87
}
88
89
void
unlock() {
90
PopLockRank(rank_);
91
mutex_.unlock();
92
}
93
94
void
lock_shared() {
95
PushLockRank
(rank_);
96
mutex_.lock_shared();
97
}
98
99
void
unlock_shared() {
100
PopLockRank(rank_);
101
mutex_.unlock_shared();
102
}
103
104
private
:
105
std::shared_mutex mutex_;
106
LockRank
rank_;
107
};
108
109
}
// namespace rex::platform
110
111
namespace
rex::platform::lock_rank {
112
114
inline
constexpr
LockRank
kInterruptState
{1};
115
117
inline
constexpr
LockRank
kObjectIdentityMap
{2};
118
120
inline
constexpr
LockRank
kObjectTable
{3};
121
123
inline
constexpr
LockRank
kObjectNameMap
{4};
124
126
inline
constexpr
LockRank
kThreadRegistry
{5};
127
129
inline
constexpr
LockRank
kModuleRegistry
{6};
130
132
inline
constexpr
LockRank
kObjectState
{7};
133
135
inline
constexpr
LockRank
kDPC
{8};
136
137
}
// namespace rex::platform::lock_rank
rex::NonCopyable
Definition
utility.h:37
rex::platform::lock_rank::kObjectIdentityMap
constexpr LockRank kObjectIdentityMap
Definition
lock_order.h:117
rex::platform::lock_rank::kObjectState
constexpr LockRank kObjectState
Definition
lock_order.h:132
rex::platform::lock_rank::kObjectTable
constexpr LockRank kObjectTable
Definition
lock_order.h:120
rex::platform::lock_rank::kDPC
constexpr LockRank kDPC
Definition
lock_order.h:135
rex::platform::lock_rank::kThreadRegistry
constexpr LockRank kThreadRegistry
Definition
lock_order.h:126
rex::platform::lock_rank::kObjectNameMap
constexpr LockRank kObjectNameMap
Definition
lock_order.h:123
rex::platform::lock_rank::kModuleRegistry
constexpr LockRank kModuleRegistry
Definition
lock_order.h:129
rex::platform::lock_rank::kInterruptState
constexpr LockRank kInterruptState
Definition
lock_order.h:114
rex::platform
Definition
platform.h:345
rex::platform::SetLockOrderHandler
LockOrderHandler SetLockOrderHandler(LockOrderHandler handler)
rex::platform::PushLockRank
void PushLockRank(LockRank rank)
rex::platform::LockOrderHandler
void(*)(LockRank held, LockRank acquiring) LockOrderHandler
Definition
lock_order.h:36
rex::platform::LockRank
LockRank
Definition
lock_order.h:26
rex::platform::LockRank::kLeaf
@ kLeaf
Definition
lock_order.h:27
platform.h
Platform flags, packing macros and export markers.
REX_API
#define REX_API
Definition
platform.h:177
types.h
Integer types, byte order wrappers and size literals.
utility.h
Move only function, const propagating pointer and scope guard.
rex
platform
lock_order.h
Generated by
1.18.0